我正在尝试通过使用Socket
与本地网络上的设备建立通信,并使用Socket.isConnected()
方法验证连接 - 看起来很简单,但我得到了一些奇怪的行为
目前,我使用no-arg 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,但无论提供的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
答案 0 :(得分:0)
我不能复制这种行为,但这是一个猜测。
您的防火墙允许端口80(http)和81(通常用作http备用)。这些端口尝试,然后超时后无法连接。其他未在防火墙中打开的端口(如82)会立即被拒绝。