目前您的应用程序将either作为服务器运行or客户端,取决于您是否提供命令行参数。要在同一进程中运行,您需要(至少)启动两个线程 - 一个用于服务器,一个用于客户端。
但目前,我只是在两个不同的命令窗口中启动它两次 - 一次使用命令行参数(使其成为客户端),一次不使用命令行参数(使其成为服务器)。
编辑:我刚刚注意到你的 main 方法永远不会运行Server()
。所以你需要把它改成这样:
if (args.length == 1) {
Client();
} else {
Server();
}
(您可能还想同时开始遵循 Java 命名约定,顺便将方法重命名为client()
and server()
.)
然后删除Server()
从末尾调用Client()
,并调用无参数DatagramSocket
构造函数在Client()
以避免尝试成为服务器......
完成的代码可能看起来某物像这样:
import java.io.IOException;
import java.net.*;
public class ClientServer {
private static void runClient() throws IOException {
InetAddress address = InetAddress.getLocalHost();
DatagramSocket ds=new DatagramSocket();
int pos = 0;
byte[] buffer = new byte[100];
while (pos < buffer.length) {
int c = System.in.read();
buffer[pos++]=(byte)c;
if ((char)c == '\n') {
break;
}
}
System.out.println("Sending " + pos + " bytes");
ds.send(new DatagramPacket(buffer, pos, address, 3000));
}
private static void runServer() throws IOException {
byte[] buffer = new byte[100];
InetAddress address = InetAddress.getLocalHost();
DatagramSocket ds = new DatagramSocket(3000, address);
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
ds.receive(dp);
System.out.print(new String(dp.getData(), 0, dp.getLength()));
}
public static void main(String args[]) throws IOException {
if (args.length == 1) {
runClient();
} else {
runServer();
}
}
}
请注意,这仍然不是great代码,特别是使用系统默认字符串编码......但它有效。通过运行在一个窗口中启动服务器java ClientServer
,然后在另一个窗口中运行java ClientServer xxx
,输入消息并按回车键。您应该在服务器窗口中看到它。