OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
out.write(data);
out.flush();
socks ——套接字;数据 - 字符缓冲区;
因此,如果我不关闭“out”或“sock”,则不会有数据发送到服务器。
OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
out.write(data);
out.close();
很好。但是为什么?
最佳答案
flush()
仅将 Java/Android 的应用程序级缓冲区刷新到 TCP 堆栈。一旦到达那里,它可能会被操作系统的 TCP 实现进一步延迟,它试图有效地使用传输的数据包并等待更多数据。 (如果您需要更多详细信息,请搜索“Nagle 算法”。)
无法在每次写入套接字时刷新 TCP 缓冲区,但可以通过设置 TCP_NODELAY
将套接字配置为在可能的情况下立即发送缓冲区中的所有数据。
参见 Java ObjectOutputStream on Socket not flush()ing有关该主题的更多信息。
关于Android:OutputStreamWriter 刷新后未发送数据(套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297173/