我試圖通過使用Socket
與本地網絡上的設備建立通信,並使用Socket.isConnected()
方法驗證連接 - 看起來很簡單,但我收到了一些奇怪的行爲。Java - socket.isConnected使用端口80將任意IP地址返回true
目前,我使用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到1023被保留。 –
如果討論端口,我幾乎可以在任何地方看到這個答案,它沒有任何意義。端口1到1023是衆所周知的端口,但不是神奇地禁止訪問,否則HTTP(端口80上運行)不會是它的原樣。然而,重要的是要注意,這些端口通常需要某些特權,但它們當然不能被使用。 – MandM
另外,即使端口確實是非法的,我相信在Socket.isConnected()總是返回false的情況下,問題會被翻轉。感謝您的回答,但請首先考慮問題的性質。 – MandM