2012-05-25 23 views
1

我有一个BufferedOutputStream问题。我想通过套接字连接从Android设备发送一个kml文件到一个java服务器。 (连接是好的,我已经能够与我的程序的其他部分的PrintWriter交换数据)Android - BufferedOutputStream不刷新

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

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

INFILE是用来读取KML文件我流 出来是用我的插座的OutputStream我的BufferedOutputStream

我不收我的了对象,但我不想,我不不要只用一次。这就是问题所在...... 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:套接字输出已关闭

因此,如何刷新我的缓冲区而不关闭我的sokcet正在无法打开新的输出流?

+0

哪种类型的OutputStream是BufferedOutputStream的基础? – vaughandroid

+0

从具有s.getOutputStream()的套接字获取的outputStream。 – ZarkDev

+0

我想你需要仔细看看服务器端实际发生了什么。你可以发布那么做的代码吗?我有一种感觉@ EJP的答案是在正确的轨道上... – vaughandroid

回答

3

Socket.close()Socket.shutdownOutput()都发送一个EOS到对方,在这个对话上他应该关闭套接字,然后你不能再写入套接字,因为你已经关闭了它。

所以,如果你需要继续写入套接字,你不能使用这些方法。

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

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

我的协议如下: Android发送“kml_itineraire \ n”,服务器回答ACK。 然后,我发送我的问题中提出的文件。一旦接收完成,服务器会向Android发送另一条特定消息。 我发现了另一个解决方案,获取文件内容在一个字符串中,并用PrintWriter.println()写入它。Java使用readLine()接收此String。这种解决方案的工作原理,但我希望使用二进制传输... (对不起,我的英文,我fernch:s) – ZarkDev

+0

@ Zarkaos正是如此。换行符是一个带外分隔符的例子。例如,您也可以使用DataOutputStream.writeUTF()和DataInputStream.readUTF()。 – EJP