2012-10-06 63 views
0

我正在从我从套接字的服务器端接收到的输入流中读取数据。我不知道我的回答的大小将是什么方式,我读入一个字节数组这是代码输入流中的无限循环

public static String readString(InputStream inputStream) throws IOException { 

    ByteArrayOutputStream into = new ByteArrayOutputStream(); 
    byte[] buf = new byte[4096]; 
    for (int n; 0 < (n = inputStream.read(buf));) { 
     System.out.println("Got to this point n is "+n); 
     into.write(buf, 0, n); 
    } 
    into.close(); 
    System.out.println("passed this point"); 
    return new String(into.toByteArray(), AddATudeMessage.CHARENC); 
} 

写信跟11和235获得打印到控制台的数字,所以我假定服务器仍然将输出写入输入流。但它在235被卡住,没有什么可以发生。我尝试暂停主执行线程长达20秒,此时我从服务器接收到241个字节,然后同一无限循环再次发生任何人知道发生了什么

回答

2

您的代码结构的方式,它只能在服务器关闭套接字时才能工作。否则,你的一方永远不会知道服务器是完成还是仅仅很慢(或者有网络拥塞)。

只有两种方法来解决这个问题:

  1. 已在服务器首先发送预期的长度,然后停止阅读,当你接收的字节指定数量的继续。
  2. 让服务器在完成时发送一个特殊的数据序列,某种类型的EOF标记不会在正常数据中出现,您可以在没有更多数据时查找这些标记。

使用available()的解决方案不正确,因为如果接收缓冲区当前为空,但仍有数据正在传输,则它可返回零。

+0

@crazycasta服务器没有关闭套接字,我不得不检查是否有行尾字符,然后我停止阅读 – sola

0

inputStream.read(buf)inputStream.read(buf)直到服务器关闭才会返回0套接字(或者可能是一些元数据包的特殊情况)。

0

考虑使用int available()(InputStream)
它返回可以从该输入流读取(或跳过)的字节数,而不会被该输入流的下一个调用者方法阻塞。

-1

int InputStream.read()会阻塞,直到它从套接字接收数据,接收流序列的结尾或引发异常。

考虑使用这样的说法:

for (; inputStream.available() > 0;) 

在这种情况下,如果在插座上没有可用的数据,for循环结束和程序可以继续。当然,你将不得不调整你的代码来做你想做的事情。