Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过两级路由器进行upnp转发端口_Java_Networking_Port_Nat_Upnp - Fatal编程技术网

Java 如何通过两级路由器进行upnp转发端口

Java 如何通过两级路由器进行upnp转发端口,java,networking,port,nat,upnp,Java,Networking,Port,Nat,Upnp,我正在使用JavaSBBI库转发端口。 但是我的路由器连接到了另一个路由器, 因此,第一个路由器的外部ip是 由第二个路由器dhcp提供的ip。 有没有办法在第二台路由器上转发端口? 这是我的密码: InternetGatewayDevice[] devices=InternetGatewayDevice.getDevices( 1000 ); System.out.println("Found "+devices.length+" Devices"); InternetGatewayDevic

我正在使用JavaSBBI库转发端口。 但是我的路由器连接到了另一个路由器, 因此,第一个路由器的外部ip是 由第二个路由器dhcp提供的ip。 有没有办法在第二台路由器上转发端口? 这是我的密码:

InternetGatewayDevice[] devices=InternetGatewayDevice.getDevices( 1000 );
System.out.println("Found "+devices.length+" Devices");
InternetGatewayDevice dev = devices[ 0 ];
System.out.println(dev);
System.out.println( "External IP = " + dev.getExternalIPAddress() );

System.out.println( dev.addPortMapping( "Streamternet", "TCP", null, 1333,
                                        "192.168.0.105", 8888, 0 ) );

System.out.println( "waiting for connection" );
HTTPServer.main(null);

据我所知,这是不可能与您当前的设置,因为您无法访问您的路由器的网关直接

我能想到两种解决方案

  • 禁用您的路由器DHCP服务器,这样他和您都可以从第二个路由器获得IP,然后您将拥有相同的子网,您可以访问每个路由器
  • 让另一台电脑连接到第二个路由器网络,让他成为一台服务器,监听您的命令,该服务器将为您执行UPNP任务。(这可能需要先手动设置端口转发)

  • 希望我能帮上忙。

    正如@Danpe在他的回答中所说的那样,UPnP不会让您在支持多个NAT时打开端口

    由于我也在开发一款P2P软件,从我收集的信息来看,以下是连接两个对等点的方法:

  • 使用TCP或UDP连接
  • 如果上述方法不起作用,则两侧的一个路由器使用一个。尝试UPnP或NAT-PNP
  • 若上述方法不起作用,那个么应用程序要么在不支持UPnP、NAT-PNP的路由器后面。。。或者你在多个级别的NAT后面。现在,您可以:

  • 与应用程序的用户通信,告知她需要打开这些路由器上的端口。正如您在评论中提到的,这是一个不幸的解决方案,因为它假定用户拥有先进的技术知识。但这似乎确实是一些公司的实际做法。例如,见

  • 使用一个中继服务器,例如一个使用该服务器的服务器,具有关闭端口的用户将通过该服务器进行通信。此中继服务器可以是端口打开的一个或多个对等方(如uTorrent),也可以是您的服务器,或两者的组合:如果有端口打开的对等方,请使用它们,否则请使用您自己的服务器(Skype就是这种情况)


  • 这不是一个选项。。。我正在开发一个软件,我不能告诉我的用户去做。也许你能帮我做这个?你如何确定你的用户有两个路由器,一个接一个?这种特殊情况只发生在高级用户设置中。并非所有软件(包括BitTorrent)都能做到这一点。如果有可能的话,这将是一个巨大的安全问题。我有一个内置路由器的电缆调制解调器,另一个简单的路由器连接到它,我的计算机连接到简单的路由器,但uTorrent仍然以某种方式工作。。。我国许多人都有这种调制解调器,他们更喜欢自己的路由器