OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
out.write(data);
out.flush();
袜子 - 插座;数据 - 字符缓冲区;
所以,如果我不关闭“out”或“sock”那么就没有数据会被发送到服务器。
OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
out.write(data);
out.close();
很好。但为什么呢?
答案 0 :(得分:0)
flush()
只将Java的/ Android应用程序级缓冲区刷新到TCP堆栈。一旦那里,可以通过操作系统的TCP实现进一步延迟,该操作系统试图有效地使用所传输的数据包并等待更多数据。 (如果您需要更多细节,请搜索“Nagle算法”。)
每次写入套接字时无法刷新TCP缓冲区,但可以将套接字配置为在可能的情况下立即发送缓冲区中的所有数据,方法是设置TCP_NODELAY
有关该主题的更多信息,请参阅Java ObjectOutputStream on Socket not flush()ing。