Java serversocket如何写入和读取不同的线程

时间:2012-02-18 18:47:34

标签: java sockets

我正在使用Java ServerSocket实现一个服务器,并且有两个客户端连接,每个客户端来自不同的线程。一个向服务器发送消息,一个从服务器读取消息。它们都在同一个端口上联系服务器,那么如何区分想要读取的客户端和想要写入的客户端呢?

ServerSocket ss = new ServerSocket(port);
while (true) {
    Socket cs = ss.accept();
    BufferedReader r = new BufferedReader(new InputStreamReader(cs.getInputStream()));
    String message = r.readLine();
    System.out.println("message");

    DataOutputStream os = new DataOutputStream(cs.getOutputStream());
    String send = "send";
    os.writeBytes(send);
}

最后一个writeBytes会导致问题,因为为了向服务器发送消息而连接的客户端已经关闭了连接。同样,想要从服务器接收的客户端不会在套接字的输入流上提交任何内容

2 个答案:

答案 0 :(得分:0)

您必须在打开会话后让客户端写一个字节或一个字符串,指示它是否要读取或写入,如果它们连接到同一个端口,您无法真正做到这一点,除非您可以区分它们通过IP地址或其他东西

答案 1 :(得分:0)

如果您在连接到同一端口时有多种用途,则必须为连接建立协议,以便客户端告诉服务器它是什么类型的客户端,并且服务器的行为相应。

对于普通协议,您只需让客户端写一个初始字节,告诉它是什么类型的客户端,然后服务器就会相应地运行。对于甚至稍微更高级的协议,可能最容易重用已经存在健壮实现的现有协议。

在您目前的情况下,协议是微不足道的,但您很快就会遇到更复杂的情况。在这里,一个基于http的REST-ful协议很可能是一个很好的chocie。