1

我正在尝试通过使用 与本地网络上的设备建立通信Socket,并使用该方法验证连接Socket.isConnected()- 看起来很简单,但我遇到了一些奇怪的行为。

目前,我使用无参数Socket()构造函数实例化一个未连接的套接字,然后在准备好后连接到服务器(位于设备的端口 80 上)。这是代码片段:

deviceSocket = new Socket();
...
SocketAddress deviceSocketAddress = new InetSocketAddress(hostName, portNum);
deviceSocket.connect(deviceSocketAddress);
if (deviceSocket.isConnected()){
     System.out.println("Connected to "+hostName+":"+portNum);
}

如前所述,portNum我必须在设备上连接的 80 是 80,但无论hostName提供什么,它总是返回true. 如果我给出一个 10.0.1.115 的 IP 地址(这是设备的地址),我得到的结果与我提供 10.0.1.114 时的结果相同,甚至是像 13.2.5.2 这样的虚假地址。

我已经做了一些研究,发现如果套接字已成功连接,该Socket.isConnected()方法将返回true,但这不是我的问题,我确保在每种情况下我都从一个全新的未连接套接字开始.

我决定把我的问题带到 telnet 上,我在其中发现了一些非常奇怪的东西。如果在telnet xxx.xxx.xxx.xxx 80命令提示符下发出命令,它总是会打开一个空白页面,该页面会挂起一段时间,然后退出到命令提示符,而不是给出适当的错误消息(假设端点确实不存在)

Connecting to 13.2.5.2... Could not open connection to the host, on port 82: Connect failed

(此外,还有一些奇怪的事情,使用端口 81 的行为方式相同,只有当我使用 82 或其他随机端口时,连接才会失败)

所以我想我偶然发现了一个有趣的问题,但我们很快就会看到......

在此先感谢您的所有回复!

-M

4

1 回答 1

0

我无法复制这种行为,但这是一个猜测。

您的防火墙允许端口 80 (http) 和 81(通常用作 http 替代)。这些端口尝试,然后在超时后无法连接。防火墙中未打开的其他端口(如 82)会立即被拒绝。

于 2012-05-16T20:38:50.950 回答