[英]Java Socket Connection: receiving completely arbitrary integers from the Input Stream
[英]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.