gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:56:57 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于java - Java 7 中的套接字未接收输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com