通过WAN进行Http通信

时间:2013-01-02 20:58:55

标签: http sockets webserver port serversocket

我有以下基本服务器/客户端Java代码,当服务器和客户端在同一网络中时有效: -

  1. 通过同一台路由器连接。

  2. 客户端通过Wifi直接连接到服务器。

  3. 所需的用例: 客户端知道服务器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

    Socket server on WAN

    问题(可能是天真的和基本的):

    1. 有没有办法在没有端口转发和使用Java的情况下执行此操作?

    2. 如果需要端口转发,如何从服务器代码中转发应用程序端口。我的用户将在他/她的机器上安装服务器代码,我不会麻烦用户手动转发端口。

    3. Google或Stackoverflow等已知服务器如何监听来自随机客户端的传入流。这些服务器与我发布的上述服务器代码有何不同(按概念)?

    4. 我是否需要将我的服务器实现为公共Web服务器,只是为了接收字节数组?

    5. 如果不是代码,概念性见解表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

当我通过Java搜索NAT时,在SO上找到以下答案:

Sockets through NAT

以上导致我打孔。我在这个问题的答案中找到了关于打孔和防火墙,NAT的更多概念性信息:

Hole Punching and NAT

基于以上讨论的更多资源:

P2P across NAT

这些资源帮助我完全理解了这个概念。完成后我会在java中发布我的代码。

谢谢paulsm4