2013-01-02 37 views
0

我有以下基本的服務器/客戶端的Java代碼,當服務器和客戶端在同一網絡中的作品: -HTTP通信通過WAN

  1. 通過同一路由器連接。

  2. 客戶端通過Wifi直接連接到服務器。

用例需要的: 客戶知道服務器IP /端口(可以是本地或在互聯網上的任何地方)。客戶端將字節數組發送到服務器(正在監聽端口)。服務器處理收到的字節數組。

下面的代碼(僅適用於相關的片段,省略的try-catch塊這裏):

Server.java

public static final int SERVERPORT = 4444; 
byte[] inBuffer = new byte[1024]; 
int bytes 

ServerSocket serverSocket = new ServerSocket(SERVERPORT); 
Socket client = serverSocket.accept(); 
InputStream inputStream = client.getInputStream(); 

bytes = inputStream.read(inBuffer); 

/* now process input */ 

Client.java

OutputStream tmpOut; 


/* Server IP and PORT are known to the client, manually entered by user */ 
InetAddress serverAddress = InetAddress.getByName(ServerIP); 
serverSocket = new Socket(serverAddress,SERVERPORT); 
tmpOut = serverSocket.getOutputStream(); 
tmpOut.write(buffer); 

該作品當服務器與客戶端在同一網絡中時,如預期的那樣。但是,如果我將服務器連接到不同的網絡,並將客戶端連接到另一個網絡,然後使用服務器的公用IP運行上述客戶端代碼,則它不會連接到服務器。

這些以前的問題表明,客戶端側路由器無法找到服務器,服務器需要轉發的端口:

Socket Listener to non-local IP

Non-local connection with sockets

Socket server on WAN

問題(可能天真而基本):

  1. 有沒有辦法做到這一點沒有端口轉發和使用Java?

  2. 如果端口轉發是必要的,我如何從服務器代碼內部轉發應用程序端口。我的用戶將在他/她的機器上安裝服務器代碼,並且我不會麻煩用戶手動轉發端口。

  3. 像Google或Stackoverflow這樣的已知服務器如何偵聽來自隨機客戶端的傳入流。這些服務器與我發佈的上述服務器代碼有何不同(根據概念)?

  4. 我是否需要將我的服務器實現爲公共Web服務器,才能接收字節數組?

如果不是代碼,我們會對概念性的見解表示讚賞。謝謝!

+2

問:那麼你的問題是什麼部分不是「NAT /路由器/防火牆101」??? – paulsm4

+0

從來沒有與NAT /路由器/防火牆工作過,我不知道處理這些是需要的。這就是爲什麼我說,即使是針對這個用例的概念性見解,也是值得讚賞的。謝謝,我將着眼於如何處理這些問題並嘗試找出解決方案。 –

+1

相信我:你的第一個問題應該是你的網絡管理員:「你可以在你的防火牆上打開這個端口嗎?」谷歌爲「NAT」或「防火牆」的一些「概念背景」:) – paulsm4

回答

0

當我通過Java搜索NAT,發現SO如下回答:

Sockets through NAT

以上導致我打孔。我發現了大約在回答這個問題打孔和防火牆,NAT更多概念性的信息:基於上述討論

Hole Punching and NAT

更多資源:

P2P across NAT

這些資源幫助我完全理解這個概念。完成後,我會在java中發佈我的代碼。

謝謝paulsm4