2013-01-09 66 views
0

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

我可以确认它连接到的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并拨打不同的电话,添加一些睡眠。

+0

服务器如何工作?它在写入输出后立即关闭套接字吗? – partlov

+0

两者都保持打开状态,直到发送断开连接命令。 – Swop

+0

你是如何检测到的,* socket似乎在InputStream *中什么都没有收到?调试?还是打印输出? – Andremoniy

回答

1

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

有几个,如果任何正确的使用available(),这不是其中之一。

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

+0

'套接字sock = SSLSocketFactory.getDefault()。createSocket'看起来只返回一个标准套接字。我只是尝试将它转换为Java 7中的SSLSocket,因为我尝试了随机事物。 – Swop

+0

@Swop不,它返回一个SSLSocket。否则,它究竟是什么意思呢?如果您不想使用SSL,请不要使用SSL类。 – EJP

+0

非常感谢,这确实解决了问题。然而,我用SSLSocket的'in.available()'确实检查了它在Java 6中得到了什么,它会返回一个有效的非零数字。 – Swop