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