Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7中的套接字未接收输入_Java_Sockets_Networking_Java 7_Java 6 - Fatal编程技术网

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

Java 7中的套接字未接收输入,java,sockets,networking,java-7,java-6,Java,Sockets,Networking,Java 7,Java 6,我在尝试将我的一个应用程序从Java6升级到Java7时遇到了一个有趣的问题。这是一个简单的Java套接字程序。它向COM套接字发送命令并接收响应。它在Java6环境中工作得非常好,但是当我尝试在Java7环境中运行相同的代码时,套接字在InputStream中似乎没有接收到任何内容 我可以确认它所连接的COM套接字是否接收到命令并发送响应。这两种情况下都是在完全相同的机器上运行,防火墙被禁用,并且两次运行的代码完全相同 Java7中有什么变化吗?我是否有更深层次的缺陷,或者这仅仅是一个Java

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

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

Java7中有什么变化吗?我是否有更深层次的缺陷,或者这仅仅是一个Java bug

下面是代码的一个稍微精简的版本

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];
      }
    }
  }
}
publicstaticvoidmain(字符串[]参数)引发异常{
InetAddress服务器=InetAddress.getByName(服务器地址);
Socket sock=SSLSocketFactory.getDefault().createSocket(server.getHostAddress(),port);
InputStream in=sock.getInputStream();
OutputStream out=sock.getOutputStream();
out.write(command.getBytes());//是有效的命令
字符串标记=”;
responseReader:while(true){
试一试{
睡眠(1);
}
catch(InterruptedException异常){}
字节[]d=新字节[in.available()];
int avail=in.read(d);
for(int i=0;i

我已经尽了我所能去尝试,大多数时候我知道这不重要。使用不同的方法读取流、强制转换到SSLSocket并进行不同的调用、添加一些睡眠。

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

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


请注意,对于SSLSocket,available()总是返回零,并且总是在Java1.3和单独的JSSE下载中这样做。所以我不能接受同样的代码在Java 6中工作。

服务器的行为如何?它是否在写入输出后立即关闭套接字?在发送断开连接命令之前,两者都保持打开状态。您是如何检测到该套接字在InputStream中似乎未接收任何内容的?调试?或者打印输出?我会打印出avail,并打印无限循环中任何给定时间的令牌。可能是您在编写命令后忘记了输出流吗?
Socket sock=SSLSocketFactory.getDefault()。createSocket
看起来只返回一个标准套接字。我只是在Java 7中尝试将其强制转换为SSLSocket,因为我尝试了随机操作。@Swop否。它返回一个SSLSocket。否则,它到底有什么意义?如果您不想要SSL,请不要使用SSL类。非常感谢,这确实解决了问题。然而,我确实用SSLSocket用
in.available()
仔细检查了Java 6中的内容,它将返回一个有效的非零数字。是的,如果接收并解密了作为应用程序数据的完整SSL记录,它可以从JDK 6中执行此操作。否则它除了返回零之外什么都做不了。