代码之家  ›  专栏  ›  技术社区  ›  Alec Gorge

Java中socket上的流式响应

  •  3
  • Alec Gorge  · 技术社区  · 14 年前

    我有一个Java socket服务器,连接socket运行良好。我需要帮助的是将响应流传回客户端。

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

    我试着简单地使用 write flush ,但我真的不知道我在做什么。。。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Peter Lawrey    14 年前

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

    如果您查看Sun的JDK 6 java.net.SocketOutputStream,您将看到flush()方法什么也不做。并非所有平台都保证如此,可能需要flush()。

        2
  •  3
  •   Martin Algesten    14 年前

    根据本机实现,套接字可能有一个缓冲区,在调用write()时不会发送字节。不过,flush()将强制发送字节。通常,发送较大的块而不是逐字节(对于流媒体,通常是从在接收器端建立缓冲区开始)是一种好的做法。最佳的网络使用可能是发送尽可能大的数据包(受MTU的限制)。要在java中有一个本地缓冲区,请将套接字outputstream包装在BufferedOutputStream中。

        3
  •  1
  •   christian    14 年前

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