0

我在尝试将我的一个应用程序从 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 并进行不同的调用,添加一些睡眠。

4

1 回答 1

1

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

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

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

于 2013-01-14T03:49:37.350 回答