Java中对套接字的流式响应

时间:2010-11-24 07:08:10

标签: java json sockets streaming

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

我使用socket.getOutputStream()获取输出流。我怎样才能这样做,以便当我写入输出流时立即发送它,但将来在相同的连接上我可以发送另一块数据。

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

3 个答案:

答案 0 :(得分:3)

根据本机实现,套接字可能有一个缓冲区,而不是在第二次调用write()时发送字节。但是,flush()将强制发送字节。通常情况下,最好发送更大的块而不是逐字节(对于流式传输,通常首先在接收器侧建立缓冲区)。最佳网络使用可能是发送尽可能大的数据包(受MTU限制)。要在java中使用本地缓冲区,请将套接字输出流包装在BufferedOutputStream中。

答案 1 :(得分:2)

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

如果你看一下Sun的JDK 6 java.net.SocketOutputStream,你会发现flush()方法什么都不做。在所有平台上都不保证这一点,并且可能需要flush()。

答案 2 :(得分:1)

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