gpt4 book ai didi

java - TCP 客户端/服务器属于一类

转载 作者:行者123 更新时间:2023-12-01 15:38:33 25 4
gpt4 key购买 nike

我正在尝试编写一个同时作为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com