我有以下基本的服務器/客戶端的Java代碼,當服務器和客戶端在同一網絡中的作品: -HTTP通信通過WAN
通過同一路由器連接。
客戶端通過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
問題(可能天真而基本):
有沒有辦法做到這一點沒有端口轉發和使用Java?
如果端口轉發是必要的,我如何從服務器代碼內部轉發應用程序端口。我的用戶將在他/她的機器上安裝服務器代碼,並且我不會麻煩用戶手動轉發端口。
像Google或Stackoverflow這樣的已知服務器如何偵聽來自隨機客戶端的傳入流。這些服務器與我發佈的上述服務器代碼有何不同(根據概念)?
我是否需要將我的服務器實現爲公共Web服務器,才能接收字節數組?
如果不是代碼,我們會對概念性的見解表示讚賞。謝謝!
問:那麼你的問題是什麼部分不是「NAT /路由器/防火牆101」??? – paulsm4
從來沒有與NAT /路由器/防火牆工作過,我不知道處理這些是需要的。這就是爲什麼我說,即使是針對這個用例的概念性見解,也是值得讚賞的。謝謝,我將着眼於如何處理這些問題並嘗試找出解決方案。 –
相信我:你的第一個問題應該是你的網絡管理員:「你可以在你的防火牆上打開這個端口嗎?」谷歌爲「NAT」或「防火牆」的一些「概念背景」:) – paulsm4