我正在尝试编写一个同时作为 TCP 客户端和 TCP 服务器的程序,以便通过分布式网络广播消息。在我能够将这些程序的多个实例连接在一起之后,我发现我无法从套接字读取数据。我简化了实现,仍然有同样的问题。
简化后的代码如下:
public class Server {
public static void main(String[] args){
try {
ServerSocket ssocket = new ServerSocket(1234);
Socket socket = new Socket("localhost", 1234);
socket = ssocket.accept();
String data = "Hello World";
PrintWriter out;
out = new PrintWriter(socket.getOutputStream(), true);
System.out.print("Sending string: '" + data + "'\n");
out.print(data);
out.flush();
BufferedReader in = new BufferedReader(new
InputStreamReader(((Socket) socket).getInputStream()));
System.out.print("Received string: '");
while (!in.ready()) {}
System.out.println(in.readLine());
System.out.print("'\n...");
in.close();
} catch (UnknownHostException e2) {
e2.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
运行代码时,我收到以下输出:
Sending string: 'Hello World'
Received string: '
为什么我无法读取输入流?
最佳答案
变量 socket
依次指向两个不同的 Socket
对象:第一个是您作为服务器客户端创建的对象。其次,ServerSocket
返回一个连接到客户端的套接字。当您创建第二个时,您将丢弃对第一个的引用。但是,当您将数据打印到其中一个套接字时,它会显示在另一个套接字上。由于您只有对两个套接字之一的引用,因此您将永远无法观察到正在接收的数据。
如果您要在同一进程中拥有客户端和服务器并相互通信,那么您确实需要使用单独的线程。通常,在这样的简单程序中,服务器部分会创建一个新线程来为每个连接提供服务。这在这里效果很好。
关于java - TCP 客户端/服务器属于一类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8459865/