套接字在Java 7中没有接收输入

时间:2013-01-09 15:09:08

标签: 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并进行不同的调用,添加一些睡眠。

1 个答案:

答案 0 :(得分:1)

代码错了。你不应该像那样使用available()。如果没有可用数据,您将分配零长度缓冲区并执行零长度读取,这将在不阻塞的情况下重新调零。使用类似8192的常量作为缓冲区大小,并在循环外部分配缓冲区。并摆脱睡眠()。

如果正确使用available(),则很少,而且这不是其中之一。

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