繁体   English   中英

套接字未在Java 7中接收输入

[英]Socket not Receiving Input in Java 7

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

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

几乎没有可用的available()正确用法,这也不是其中之一。

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

暂无
暂无

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

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