Java - socket.isConnected使用端口80将true返回给任何IP地址

时间:2012-05-16 20:11:36

标签: java sockets telnet

我正在尝试通过使用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

1 个答案:

答案 0 :(得分:0)

我不能复制这种行为,但这是一个猜测。

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