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

标签 java sockets tcp

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

相关文章:

java - 为android编写一个超时事件

java - Eclipse/Jframe - 无法启动

java - 如何实现两个不同的服务器,由客户端使用相同的对象调用

.net - TcpListener 请求泛滥

java - 如何设置 JLabel 数组中元素的文本?

java - 将 ArrayList 从 android 模块传递到 libgdx 中的核心

c - 服务器认为2个不同IP的客户端是同一个客户端(C Socket编程)

c# - 无法关闭异步 C# 服务器套接字连接

python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?

sockets - 从 lisp 中的套接字流读取行