【问题标题】:Writing to Socket outputStream w/o closing it写入 Socket inputStream 而不关闭它
【发布时间】:2011-02-19 01:23:14
【问题描述】:

我想给服务器写一些消息。 每次,仅对于电车,我都会关闭 outputStream 并在我必须发送下一条消息时重新打开它。

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();

我怎样才能保持这个 Socket 的 OutputStream、os 处于打开状态并且仍然能够发送消息?

谢谢。

【问题讨论】:

    标签: java sockets network-programming ou


    【解决方案1】:

    我在这里遗漏了一些东西。如果您不调用close,它将不会关闭。例如,

    os.write(msgBytes);
    os.write("\r\n".getBytes());
    os.flush();
    // Do something 
    os.write("more message");
    os.flush();
    // When you are finally done
    os.close();
    

    【讨论】:

      【解决方案2】:

      在大多数协议中,服务器接受 som 类型的 EOF 符号。发送这样的符号而不是关闭流。

      例如,IRC 服务器将“\r\n”解释为消息的结尾。这将是一个打开的 OutputStream 上的 2 条消息:

      PrintStream printStream = new PrintStream(socket.getOutputStream());
      printStream.print("JOIN #channel1\r\n");
      printStream.flush( );
      printStream.print("JOIN #channel2\r\n");
      printStream.flush( );
      

      此外,您应该使用 DataOutputStream 包装您的 outputStream。这个包装器创建了更便携的输出。如果服务器和客户端具有不同的计算机架构,普通的 OutputStream 可能会导致某些原始数据类型出现问题。

      【讨论】:

        【解决方案3】:

        SocketOutputStream 包装在PrintWriter 中并调用PrintWriterprintln 方法。

        PrintWriter pw = new PrintWriter(socket.getOutputStream());
        ....
        pw.println(message); // call repeatedly to send messages.
        ....
        pw.close(); // when finished writing to server and want to close conn.
        

        【讨论】:

          【解决方案4】:

          我发现了问题,它位于客户端。 在客户端,我用过 -

          count = inputStream.read(buffer)) > -1
          

          也就是说,客户端等待服务器的 outputStream 关​​闭,然后处理传入的数据。

          【讨论】:

            猜你喜欢
            • 2011-10-11
            • 2021-06-12
            • 1970-01-01
            • 1970-01-01
            • 2012-11-16
            • 1970-01-01
            • 2011-04-09
            • 1970-01-01
            • 2012-04-25
            相关资源
            最近更新 更多