如何在不关闭OutputStream对象的情况下强制刷新它?

Gro*_*Man 7 java sockets android outputstream

我的问题在于以下假设,我希望这些假设是正确的,因为我相信这些是我在谷歌搜索我的问题时读到的:

  1. 关闭套接字的OutputStream也会关闭套接字
  2. OutputStream的flush()方法什么都不做

所以我基本上需要从我的OutputStream对象中刷新数据,以使我的应用程序正常工作.

如果您对详细信息感兴趣,请参阅以下两个链接:

.奇怪的行为:将图像从Android手机发送到Java服务器(代码工作)

通过关闭OutputStream解决了此问题.这样做会将所有数据刷新到套接字的另一端并使我的应用程序进一步工作但是这个修复很快引起了问题2 - 相应的套接字也被关闭:

.SocketException - 即使isConnected()返回true,'Socket也会关闭'

smi*_*hak 6

您可以调用OutputStream的flush方法而不是close.从OutputStream继承的具体类将覆盖flush()以执行除了任何操作之外的其他操作(将数据写入文件或通过网络发送).

  • 在您发布的链接中,服务器正在等待流上的EOF(文件结尾).通过关闭流和TCP连接来发信号通知EOF - 因此服务器在循环中运行,直到您关闭客户端的输出流.如果您不希望在传输图像后关闭流,则必须设计另一种方法,以便在图像传输完成时发出信号.最简单的方法是在发送图像之前将图像大小作为整数(4个字节)发送.然后,服务器可以在退出循环之前读取该字节数. (3认同)

use*_*421 1

关闭套接字的 OutputStream 也会关闭套接字

真的。

OutputStream的flush()方法什么都不做

错误的。有覆盖。请参阅 Javadoc 中的FilterOutputStream.flush()BufferedOutputStream.flush()ObjectOutputStream.flush()、 等。所有可以在内部缓冲输出的流都有flush()方法。所有不存在的流都不会。具体来说,由 产生的输出流Socket.getOutputStream()不会被缓冲并且不会覆盖flush()

所以你最初的问题是不存在的,所以你不需要导致问题#2 的“解决方案”。