1

我对 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 是我的 BufferedOutputStream 使用我的套接字的 OutputStream

我没有关闭我的对象,但我不想,我不只使用一次。这就是问题所在…… 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 的情况下刷新我的缓冲区无法打开新的输出流?

4

1 回答 1

3

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

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

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

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