我有以下基本服务器/客户端Java代码,当服务器和客户端在同一网络中时有效: -
通过同一台路由器连接。
客户端通过Wifi直接连接到服务器。
所需的用例: 客户端知道服务器IP /端口(可能是本地或Internet上的任何位置)。客户端将字节数组发送到服务器(正在侦听端口)。服务器处理接收到的字节数组。
这是代码(只有相关的代码片段,此处省略了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服务器,只是为了接收字节数组?
如果不是代码,概念性见解表示赞赏。谢谢!
答案 0 :(得分:0)
当我通过Java搜索NAT时,在SO上找到以下答案:
以上导致我打孔。我在这个问题的答案中找到了关于打孔和防火墙,NAT的更多概念性信息:
基于以上讨论的更多资源:
这些资源帮助我完全理解了这个概念。完成后我会在java中发布我的代码。
谢谢paulsm4