【问题标题】:Java serversocket how to write and read to different threadsJava serversocket如何写入和读取不同的线程
【发布时间】:2012-02-18 18:47:34
【问题描述】:

我正在使用 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 会导致问题,因为连接以便向服务器发送消息的客户端已经关闭了连接。同样,想要从服务器接收的客户端不会在套接字的输入流上提交任何内容

【问题讨论】:

    标签: java sockets


    【解决方案1】:

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

    【讨论】:

    • @user1190650:换句话说 - 你必须指定和实现一个应用程序特定的协议......
    【解决方案2】:

    如果您对连接到同一个端口时发生的事情有多种用途,则必须为连接建立一个协议,以便客户端告诉服务器它是哪种客户端,并且服务器会做出相应的行为。

    对于琐碎的协议,您可以简单地让客户端写入一个初始字节,告知它是哪种客户端,然后服务器会做出相应的行为。对于更高级的协议,重用已经存在健壮实现的现有协议可能是最容易的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多