Android:OutputStreamWriter 刷新后未发送数据(套接字)

标签 android sockets flush

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/

相关文章:

android - 如何获取 Android 平台的 vonage 手机的 web 服务 api?

node.js - 运行 pm2 日志错误 SyntaxError : Unexpected token

c++ - 在我的代码中出现这个 "10038 wsa socket"错误

c++ - 一个流是如何与另一个流联系在一起的?

hibernate - 刷新模式在 grails 中从 AUTO 更改为 MANUAL

android - 将 URL 中的 HTTP 参数与 Android Intent 过滤器匹配

java - Android Media Codec API 基本示例

javascript - 语法错误 : Strict mode does not allow function declarations in a lexically nested statement

c# - 如何优化 SSL session ,以便以后(如果需要)重用它来提高客户端服务器性能

c# - 需要双冲吗?