[英]TCP Client/Server in one class
我试图同时编写一个既是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
返回的值,该值已连接到客户端。 当您创建第二个时,您将放弃对第一个的引用。 但是,当您将数据打印到其中一个插槽时,它将显示在另一个插槽上。 由于您仅引用了两个套接字之一,因此您将永远无法观察到接收到的数据。
如果您要在同一进程中拥有一个客户端和一个服务器,并且彼此交谈,那么您确实需要使用单独的线程。 通常,在像这样的简单程序中,服务器部分会创建一个新的线程来为每个连接提供服务。 在这里可以很好地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.