我遇到了一个有趣的问题,试图将我的一个应用程序从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并进行不同的调用,添加一些睡眠。
答案 0 :(得分:1)
代码错了。你不应该像那样使用available()。如果没有可用数据,您将分配零长度缓冲区并执行零长度读取,这将在不阻塞的情况下重新调零。使用类似8192的常量作为缓冲区大小,并在循环外部分配缓冲区。并摆脱睡眠()。
如果正确使用available(),则很少,而且这不是其中之一。
请注意,对于SSLSocket,available()始终返回零,并且一直这样做直接回到Java 1.3和单独的JSSE下载。所以我无法接受在Java 6中使用相同的代码。