2014-02-05 124 views
1

我遇到了Java套接字程序的問題。 我在主機A上打開一個ServerSocket。 在主機B上,它位於同一個專用網絡中,我嘗試綁定到服務器,但我總是得到一個超時。Java Socket只適用於「本地主機」,但不適用於私人網絡

Host A |服務器| IP:192.168.56.1
Host B |客戶端| IP:192.168.47.1

在服務器主機A ::

welcomeSocket = new ServerSocket(2323); 
socket = welcomeSocket.accept(); 

開口的ServerSocket之後;在主機B:

socket = new Socket("192.168.56.1", 2323); 

然後在幾秒鐘後,出現異常:

java.net.ConnectException: Connection timed out: connect 

當我開始對任一主機A或B 服務器並輸入「本地主機插座不正常工作」。
這裏有什麼問題?謝謝你的幫助。

+0

你可以通過ping到達主機嗎? – Markus

回答

0

如果您的子網掩碼爲255.255.255.0(這是C類專用子網的規範),那麼你的兩臺機器在不同的子網:

Host A | Server | IP: 192.168.56.1 
Host B | Client | IP: 192.168.47.1 

的0.56。和.47。成爲操作元素。嘗試將IP更改爲192.168.56.0/24192.168.47.0/24,這樣你就可以。

或者,您需要在兩個子網之間設置靜態路由。

乾杯,

0

這通常意味着輸入端口2323是不是主機A.開放
所以主機B無法在主機A

連接到端口2323在局域網並不是所有的端口是開放的。您不能在任何您需要的端口上連接
到任何機器(從您的LAN)。

試試這個從主機B:

telnet 92.168.56.1 2323

如果無法以這種方式進行連接,然後你的客戶端的Java程序
將無法​​連接太,這是正常的。

然後,您應該聯繫您的網絡管理員。

如果你能連接這種方式,那麼你應該看看
以某種方式修復你的java程序。

-1

添加在HOST文件中的條目,如果IP是reachble

+0

主機文件連接IP和主機名 - 它與連接完全無關! –

0

的Javadoc setSoTimeout(int)這樣說:

啓用帶有指定超時/禁用SO_TIMEOUT,以毫秒爲單位。 如果將此選項設置爲非零超時,則調用accept()代替 此ServerSocket將僅阻塞這段時間。如果 超時過期,則會引發java.net.SocketTimeoutException,儘管ServerSocket的 仍然有效。該選項必須在 進入阻止操作之前啓用才能生效。超時必須> 0.零超時被解釋爲無限超時。

試試這個:

welcomeSocket。setSoTimeout(0);

在阻止服務器接受來自客戶端的請求之前添加此語句。

注意:確保兩臺機器都可以相互訪問以確保正確連接。

+0

由於OP聲明它在'localhost'上工作,所以它很可能不是一個延遲問題,但是否則你的觀點是正確的(但是如前所述,無關緊要)。 –

0

謝謝你的幫助!

我的程序現在工作正常。 感謝安德斯提示不同的子網掩碼,我認識到 IP是錯誤的。看着Windows控制面板,我發現主機A有一個不同的IP地址 。實際上它們在同一個子網掩碼中。

我是相當相當期待通過

InetAddress.getLocalHost().getHostAddress() 

給出我的ADRESS ADRESS。
那麼如何在java程序中顯示我的「真實」IP地址?

相關問題