java - 输入流中的无限循环

标签 java sockets input inputstream

我正在读取从套接字服务器端接收的输入流。我无法知道我的响应的大小是多少,我正在读入一个字节数组,这是代码

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() 的解决方案是不正确的,因为如果接收缓冲区当前为空但仍有数据在传输,它可能返回零。

关于java - 输入流中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763235/

相关文章:

java - SDK : command not found

java - 改造 - Log4j

python - 一个 recv 在 python 套接字中得到两个或更多发送

java - 选择您自己的故事游戏循环需要用户输入 - 当给出选项之一时,提示会重复出现问题

javascript - 在名称属性中使用方括号输入

java - 我应该用threeten代替joda-time吗

java - 保护嵌入式密码

c++ - 为什么这段 C++ 代码不起作用?

linux - 辅助数据 : ‘IP_RECVIF’ undeclared (first use in this function)

Windows 控制台中的 C++ 键输入