2013-07-21 70 views
0

我一直在Java中使用套接字的問題。首先,讓我解釋一下我想用java中的套接字來做什麼。我想通過它通過互聯網連接我的筆記本電腦。我的筆記本電腦有一臺服務器,客戶端必須通過互聯網連接。因爲我有一個路由器來處理我的本地網絡,並且我不想將路由器上的端口引導至我的筆記本電腦,所以我需要遵循「internet-> router-> localNetwork-> mylaptop」的路徑。問題是我找到了一種同時使用Internet IP地址和本地IP地址的方法;然而,它拋出一個異常:"Exception in thread "main" java.net.BindException: Address already in use"Java套接字綁定錯誤

我嘗試的代碼是:

InetAddress addr = InetAddress.getByName("XXX.XXX.XXX.XXX"); 
InetAddress local = InetAddress.getByName("YYY.YYY.YYY.YYY"); 
Socket socket = new Socket(addr, 1111, local, 1111); // The line I have got exception 

憑藉領先的路由器端口到我的筆記本電腦,我可以運行類似用途此代碼:

Socket socket = new Socket("XXX.XXX.XXX.XXX", 1111); 

* Xs代表互聯網IP地址

* Ys代表本地IP地址

*代碼是屬於代碼客戶端

回答

2

據我瞭解,你與因特網(WAN)IP XXX.XXX.XXX.XXX與NAT路由器,你必須使用本地(LAN),一臺筆記本電腦IP YYY.YYY.YYY.YYY連接到路由器,你認爲

Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111); 

將連接到筆記本電腦。 這是不正確的。您正在使用Socket類的構造函數的

文檔講述:

創建一個套接字並將其連接到指定遠程端口上的指定遠程主機。 Socket還將bind()提供給本地地址和端口。

那就是不是你想要什麼。

您不能像這樣連接到NAT後面的設備。你必須「引導路由器上的一個端口」。

+0

好的,你已經明白了。但是,如果我不想在路由器上引導端口,該怎麼辦? –

0

您不需要指定本地地址:套接字的端口,並且您這樣做是不正確的。刪除最後兩個參數。