我正在尝试同时编写既是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: '
为什么我无法读取输入流?
答案 0 :(得分:1)
变量socket
依次指向两个不同的Socket
对象:首先,您创建的对象是服务器的客户端。其次,ServerSocket
返回的是连接到客户端的那个。当您创建第二个时,您将丢弃对第一个的引用。但是,当您将数据打印到其中一个插槽时,它将显示在另一个插槽上。由于您只能引用两个套接字中的一个,因此您将永远无法观察到正在接收的数据。
如果你要在同一个进程中拥有一个客户端和一个服务器,彼此交谈,你真的需要使用单独的线程。通常在这样的简单程序中,服务器部分创建一个新的线程来为每个连接提供服务。这在这里会很好用。