代码之家  ›  专栏  ›  技术社区  ›  jonescb Denis

Java:将端口转发到服务器

  •  2
  • jonescb Denis  · 技术社区  · 15 年前

    我正在构建一个简单的服务器应用程序,我可以在本地网络中连接到它。但是我不能通过互联网连接。

    这是我的服务器代码:

    ServerSocket server;
    try {
        server = new ServerSocket(4000);
    } catch(IOException ex) {
        System.out.printf("Could not bind socket 4000\n");
        System.exit(1);
    }
    
    try {
        Socket socket = server.accept();
        ClientThread client = new ClientThread(socket);
        client.start();
    } catch(IOException ex) {
    }
    

    这就是客户:

    try {
        System.out.printf("connecting...\n");
        Socket socket = new Socket("mydomain.org", 4000);
        System.out.printf("connected!\n");
    } catch(UnknownHostException ex) {
        ex.printStackTrace();
    } catch(IOException ex) {
        ex.printStackTrace();
    }
    

    我在路由器上转发了4000端口,应该可以用。我以前转发过其他端口,比如80和22。

    当我运行客户机时,我得到了“connecting…”字符串,它挂在那里。我没有“连接!”或堆栈跟踪。但正如我之前所说,它确实在本地网络上工作。它在连接到127.0.0.1和使用192.168.1.90时工作。

    我用过 CanYouSeeMe.org 检查端口是否打开。在端口80上成功,但在4000上超时。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Matt    15 年前

    检查绑定到哪个IP地址端口4000。它只能绑定到环回地址(127.0.0.1),而不能绑定到任何接口。

    不确定您使用的是哪个操作系统,但要检查: Linux:netstat-ant Windows和Mac:netstat-anp-tcp

    在端口4000上查找侦听行,查看它是绑定到所有接口(:4000或0.0.0.0:4000),还是绑定到特定接口(127.0.0.1:4000)。

    如果它没有监听所有接口,这就是您的问题——使用允许您指定binddress的构造函数。

        2
  •  0
  •   President James K. Polk    15 年前

    你已经做过实验来证明它不是你的Java,因此必须是防火墙或防火墙问题。即使正确地将端口转发到服务器,服务器防火墙也可能不允许入站连接,因此请检查这一点。

        3
  •  0
  •   Steve Emmerson    15 年前

    您有一个防火墙规则正在丢弃传入的数据包。这就是你的客户挂起的原因。检查服务器计算机和任何通向外部世界的网关系统上的IP规则。

    推荐文章