【问题标题】:Android - BufferedOutputStream doesn't flushAndroid - BufferedOutputStream 不刷新
【发布时间】:2012-05-31 19:39:06
【问题描述】:

我遇到了 BufferedOutputStream 的问题。我想通过套接字连接将 kml 文件从 Android 设备发送到 java 服务器。 (连接正常,我已经能够与我程序的其他部分中的 PrintWriter 交换数据)

为了发送我的 kml 文件,我填充了缓冲区。但是当我刷新()它时,什么也没有发生。

        int lu = inFile.read();
        while(lu != -1){
            out.write(lu);
            lu = inFile.read();
        }
        out.flush();
        inFile.close();

inFile 是我用来读取 kml 文件的流 out 是我使用套接字的 OutputStream 的 BufferedOutputStream

我没有关闭我的 out 对象,但我不想,我不只使用一次。而这就是问题所在…… close() 方法发送缓冲区的数据但也关闭套接字。 flush() 方法不发送缓冲区的数据。

我想在不关闭套接字的情况下刷新缓冲区。

我也尝试过使用 mySocket.shutdownOutput();

        int lu = inFile.read();
        while(lu != -1){
            out.write(lu);
            lu = inFile.read();
        }
        out.flush();
        mySocket.shutdownOutput();
        inFile.close();

此方法关闭我的流并保持我的套接字打开,这就是我想要的。 但是当我尝试打开一个新的输出流时,异常 java.net.SocketException: Socket output is shutdown

那么,如何在不关闭我的 sokcet 的情况下刷新我的缓冲区无法打开新的输出流?

【问题讨论】:

  • BufferedOutputStream 是哪种类型的 OutputStream?
  • 使用 s.getOutputStream() 从套接字获取的输出流。
  • 我认为您需要仔细查看服务器端实际发生的情况。您可以发布一些这样做的代码吗?我感觉@EJP 的答案是在正确的轨道上......

标签: java android networking flush bufferedoutputstream


【解决方案1】:

Socket.close()Socket.shutdownOutput() 都向对等方发送 EOS,他应该关闭套接字,之后你不能再写入套接字,因为你已经在那个方向关闭了它。

因此,如果您需要继续写入套接字,则不能使用任何一种方法。

您可能正在搜索的是一种分隔应用程序协议消息的方法。至少有三种技术:

  1. 在每条消息之前发送一个长度字。
  2. 在每条消息后发送带外分隔符,即消息中不能出现的字节或字节序列。带有转义的 STX/ETX 协议就是一个例子。
  3. 使用自描述消息格式,例如对象序列化或 XML。 STX/ETX 也是一个例子。

【讨论】:

  • 我的协议如下:Android 发送“kml_itineraire\n”,服务器以 ACK 应答。然后,我按照问题中的说明发送文件。接收完成后,服务器会向 Android 发送另一条特定消息。我找到了另一种解决方案,在字符串中获取文件内容并使用 PrintWriter.println() 编写它 Java 使用 readLine() 接收此字符串。这个解决方案有效,但我希望使用二进制传输......(对不起我的英语,我是 fernch :s)
  • @Zarkaos 正是如此。换行符是带外分隔符的一个示例。例如,您还可以使用 DataOutputStream.writeUTF() 和 DataInputStream.readUTF()。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多