Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 使用NAT将UDP数据包发送到IP_Java_Sockets_Networking_Udp - Fatal编程技术网

Java 使用NAT将UDP数据包发送到IP

Java 使用NAT将UDP数据包发送到IP,java,sockets,networking,udp,Java,Sockets,Networking,Udp,我有一个服务器运行一个没有NAT的公共IP。它接收UDP数据包,我想将它们发送到连接的每个客户端 一个或多个客户端将支持NAT 我读过关于UDP打孔的文章,但它似乎并不是我想要的。我并不是在试图从一个客户发送到另一个客户。我希望数据流从客户端->服务器->所有客户端 客户 //初始化TCP套接字 连接=新插座(connectionAddress,54540); //创建接收套接字 DatagramSocket socketReceive=新的DatagramSocket(54541); 服务器

我有一个服务器运行一个没有NAT的公共IP。它接收UDP数据包,我想将它们发送到连接的每个客户端

一个或多个客户端将支持NAT

我读过关于UDP打孔的文章,但它似乎并不是我想要的。我并不是在试图从一个客户发送到另一个客户。我希望数据流从客户端->服务器->所有客户端

客户

//初始化TCP套接字
连接=新插座(connectionAddress,54540);
//创建接收套接字
DatagramSocket socketReceive=新的DatagramSocket(54541);
服务器


//接收插座
receiveAudioSocket=新的DatagramSocket(54541);
//线程来处理新接收的数据包
ServerAudioReceiveWorker AudioReceiveWorker=新的ServerAudioReceiveWorker(receiveAudioSocket,this);
audioReceiverWorker.start();
//TCP套接字
serverSocket=新的serverSocket(54540);
System.out.println(“服务器已启动”);
这是我的客户端服务器的基本设置

我希望如果我从客户机向服务器发送UDP数据包,则为公共IP。路由器将为客户端网络上的端口54541添加NAT规则,以接收从服务器发送回客户端和端口54541的公共IP的UDP数据包。它似乎不是那样工作的

我猜这是因为分配的NAT规则被指定了一个特定的端口,用于向公共IP发送以本地IP为目标的请求。我不确定如何找到服务器应该为每个客户端发送数据包的端口


我是否需要使用UPnP打开客户端网络上的端口,并让服务器知道将数据包发送到哪个端口。

NAT要求NAT路由器后面的客户端首先启动到外部服务器的连接,以便NAT路由器可以创建地址和端口转换的状态。来自服务器的回复必须与状态完全匹配,否则NAT路由器将无法进行回译

这意味着:

  • 您必须在客户端中使用相同的套接字进行发送和接收,也就是说,您不能像当前那样期望在不同的端口上返回回复
  • 服务器必须将消息发送到客户端用作源以联系服务器的完全相同的IP和端口,并且必须从客户端用作目的地的完全相同的IP和端口发送消息-这通常通过使用服务器上的相同套接字来完成
  • 无法向最近未联系服务器的客户端发送消息,因为在这种情况下,客户端NAT路由器中没有匹配状态(一段时间后过期)

好的,谢谢。我目前正在另一个套接字上从客户端->服务器发送:54541,然后用于在客户端541上接收。我将尝试使用相同的端口进行发送和接收,然后在服务器上注册我的客户机,并从.getPort()获取端口,该端口应该是NAT指定的端口。这样做应该有希望将数据包返回到客户端。谢谢,这很有效。在客户端DatagramSocket上,我没有指定端口(让它选择)。然后将数据包发送到服务器54541,从数据包中获取端口。然后,服务器上的注册客户端将发送到服务器的未来数据包发送到注册客户端ip:端口。虽然我没有看到NAT规则添加到我的路由器中,但它可以同时在我网络上的多台机器(NAT后面的机器)上工作。