繁体   English   中英

输入流中的无限循环

[英]Infinite Loop in Input Stream

我正在从套接字的服务器端接收的输入流中读取。 我没有办法知道响应的大小,我正在读入字节数组,这是代码

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个字节,然后同一无限循环再次发生,任何人都知道发生了什么事情

代码的结构方式只有在服务器关闭套接字后才能起作用。 否则,您的一方永远无法知道服务器是否已完成或运行缓慢(或网络拥塞)。

只有两种方法可以解决此问题:

  1. 让服务器先发送期望的长度,然后停止读取,并在收到指定的字节数后继续操作。
  2. 完成后,让服务器发送一个特殊的数据序列,这是正常数据中不会出现的某种EOF标记,您可以查找这些标记以告诉您何时没有更多数据。

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

在服务器关闭套接字之前(或可能是元数据包的某些特殊情况inputStream.read(buf)不会返回0。

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

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

考虑使用以下语句:

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

在这种情况下,如果套接字上没有可用数据,则for循环结束,您的程序可以继续。 当然,您将必须修改代码以执行您想要的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM