我有一个Java套接字服务器,连接套接字工作得很好。我需要帮助的是将响应流回客户端。
我使用socket.getOutputStream()
获取输出流。我怎样才能这样做,以便当我写入输出流时立即发送它,但将来在相同的连接上我可以发送另一块数据。
我尝试将write
和write
与flush
结合使用,但我真的不知道自己在做什么......
答案 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)