【问题标题】:Streaming response on a socket in JavaJava中的套接字上的流式响应
【发布时间】:2010-11-24 07:08:09
【问题描述】:

我有一个 Java 套接字服务器,并且连接套接字工作得很好。我需要帮助的是将响应流式传输回客户端。

我得到了socket.getOutputStream() 的输出流。我怎样才能使它在我写入输出流时立即发送,但将来在同一个连接上我可以发送另一块数据。

我尝试简单地将writewriteflush 结合使用,但我真的不知道自己在做什么......

【问题讨论】:

    标签: java json sockets streaming


    【解决方案1】:

    根据本机实现,套接字可能有一个缓冲区,并且不会在您调用 write() 的第二秒发送字节。但是,flush() 将强制发送字节。通常,发送较大的块而不是逐字节发送是一种很好的做法(对于流式传输,您通常首先在接收方建立一个缓冲区)。最佳网络使用可能是发送尽可能大的数据包(受 MTU 限制)。要在 java 中使用本地缓冲区,请将套接字输出流包装在 BufferedOutputStream 中。

    【讨论】:

    • 我的最终目标是提供一个类似于 twitter 的流 api,所以我需要发送小块信息。
    【解决方案2】:

    flush() 将强制将数据发送到操作系统。操作系统可以缓冲数据,客户端上的操作系统也可以。如果您希望操作系统更早发送数据,我建议您尝试关闭 Nagle 算法。 socket.setTcpNoDelay(true);但是,您会发现操作系统/驱动程序参数仍然会引入一些缓冲/数据包合并。

    如果您查看 Sun 的 JDK 6 java.net.SocketOutputStream,您会发现 flush() 方法什么也没做。这并不保证在所有平台上都是如此,可能需要使用 flush()。

    【讨论】:

      【解决方案3】:

      另一种解决方案可能是DataOutputStream
      DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
      dataOut.writeInt(1)

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多