java - Java 7 中的套接字未接收输入

标签 java sockets networking java-7 java-6

我在尝试将我的一个应用程序从 Java 6 升级到 Java 7 时遇到了一个有趣的问题。它是一个简单的 Java 套接字程序。它将命令发送到 COM 套接字并接收响应。它在 Java 6 环境中完美运行,但是当我尝试在 Java 7 环境中运行相同的代码时,套接字似乎在 InputStream 中没有接收到任何内容。

我可以确认它所连接的 COM 套接字确实收到了命令并发送了响应。在这两种情况下,这都在禁用防火墙的情况下在完全相同的计算机上运行,​​并且两次运行的代码完全相同。

Java 7 中有什么变化吗?我是否有一些更深层次的缺陷,或者这只是一个 Java 错误?

这是代码的稍微精简版本。

public static void main(String[] arguments) throws Exception {
  InetAddress server = InetAddress.getByName(serverAddress);
  Socket sock = SSLSocketFactory.getDefault().createSocket(server.getHostAddress(), port);
  InputStream in = sock.getInputStream();
  OutputStream out = sock.getOutputStream();
  out.write(command.getBytes()); //Is valid command
  String token = "";
  responseReader: while (true) {
    try {
      Thread.sleep(1);
    }
    catch (InterruptedException exception) {}
    byte[] d = new byte[in.available()];
    int avail = in.read(d);
    for (int i = 0; i < avail; i++) {
      if (d[i] == fieldSeperator) {
        token = "";
      }
      else if (d[i] == commandSeperator) {
        break responseReader;
      }
      else {
        token += (char) d[i];
      }
    }
  }
}

我已经尝试了我能想到的一切,大多数时候我知道这并不重要。使用不同的方法读取流,转换为 SSLSocket 并进行不同的调用,添加一些 sleep 。

最佳答案

代码错误。你不应该这样使用 available() 。如果没有可用数据,您将分配一个零长度缓冲区并执行零长度读取,这将在不阻塞的情况下返回零。使用像 8192 这样的常量作为缓冲区大小,并在循环外部分配缓冲区。并摆脱 sleep() 。

available() 的正确用法很少,这不是其中之一。

请注意,对于 SSLSocket,available() 始终返回零,并且一直返回到 Java 1.3 和单独的 JSSE 下载。所以我无法接受同样的代码在 Java 6 中也能工作。

关于java - Java 7 中的套接字未接收输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238281/

相关文章:

java - 使用 DecimalFormat 的问题

java - Android Socket TCP 数据丢失

Solaris 上的 C 套接字选择错误

python-3.x - 如何使用p2p连接访问nat后面的Web服务器

python - 这个多处理 python 脚本出了什么问题?

java - Java中的数组声明和初始化。数组的行为不同,当它们的下标索引的位置在它们的声明中改变时

java - 为什么我们必须重写 Java 中的 equals() 方法?

java - 设置土耳其语和英语语言环境 : translate Turkish characters to Latin equivalents

ios - 如何让联网的软件意识到自己?

linux - Linux 套接字缓冲区如何溢出?