2012-05-16 35 views
1

我試圖通過使用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

+0

端口1到1023被保留。 –

+0

如果討論端口,我幾乎可以在任何地方看到這個答案,它沒有任何意義。端口1到1023是衆所周知的端口,但不是神奇地禁止訪問,否則HTTP(端口80上運行)不會是它的原樣。然而,重要的是要注意,這些端口通常需要某些特權,但它們當然不能被使用。 – MandM

+0

另外,即使端口確實是非法的,我相信在Socket.isConnected()總是返回false的情況下,問題會被翻轉。感謝您的回答,但請首先考慮問題的性質。 – MandM

回答

0

我無法複製此行爲,但這裏有一個猜測。

您的防火牆允許端口80(http)和81(通常用作http備用)。這些端口嘗試,然後在超時後無法連接。其他未在防火牆中打開的端口(如82)會立即被拒絕。

+0

感謝您的回答,這似乎有點可能,但我傾向於認爲,telnet不會返回「連接失敗」,當端點被給出時不會返回,即使端口被允許通過防火牆,也是如此。 – MandM