2010-11-24 43 views
3

我有一个Java套接字服务器和连接套接字工作得很好。我需要帮助的是将响应传回客户端。我得到了输出流socket.getOutputStream()。我该如何做到这一点,以便在写入输出流时立即发送,但将来可以在同一连接上发送另一块数据。在Java套接字流式响应

我想简单地结合使用writewriteflush,但我真的不知道我在做什么...

回答

2

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

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

+0

谢谢!把Nagle的算法关闭了! – 2010-11-24 17:52:53

3

根据本地实现,插座可以有一个缓冲,而不是发送字节秒你打电话write()。然而,flush()会强制发送字节。通常情况下,发送较大的数据块而不是逐字节数据流是一种很好的做法(对于流式传输,通常先在接收端建立一个缓冲区)。最佳的网络使用可能是发送尽可能大的数据包(受MTU限制)。要在java中拥有本地缓冲区,请将套接字输出流包装在BufferedOutputStream中。

+0

我的最终目标是提供与Twitter类似的流API,所以我需要发送的信息小块。 – 2010-11-24 17:53:44

1

另一种解决办法是DataOutputStream
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
dataOut.writeInt(1)