如何为客户端数组发送UDP消息(java)

如何为客户端数组发送UDP消息(java),java,sockets,tcp,udp,Java,Sockets,Tcp,Udp,我的问题是,如何在TCP套接字中为连接到服务器的IP列表的阵列发送UDP消息 我编写的代码(仅服务器应用程序、发送部分): DatagramSocket socketclient=newdatagramsocket(); InetAddress[]IP=InetAddress.getAllByName(socketLigacao.getInetAddress().getHostAddress()); 字节[]enviaMensagem=新字节[1024]; enviaMensagem=mensa

我的问题是,如何在TCP套接字中为连接到服务器的IP列表的阵列发送UDP消息

我编写的代码(仅服务器应用程序、发送部分):

DatagramSocket socketclient=newdatagramsocket();
InetAddress[]IP=InetAddress.getAllByName(socketLigacao.getInetAddress().getHostAddress());
字节[]enviaMensagem=新字节[1024];
enviaMensagem=mensageCliente.getBytes();
对于(int i=0;i
我所做的代码只是在localhost中工作(在netbeans输出中测试),当我在不同的机器上运行时,客户端不会显示任何输出,我确信问题出在我发布的这部分代码中

如果您需要更多信息,请告诉我,我们将非常感谢您的帮助


干杯!

您的代码是正确的。问题在于网络。

在您当前的代码中,您正试图在相应的IP地址和端口(3790)向多个客户端发送UDP数据包

当您在本地主机上时,由于客户端IP和端口未映射到不同的IP和端口,因此此操作有效。 当您在本地主机上时,只需使用本地IP和机器的本地端口即可

在实际场景中,情况就不同了。客户端连接到路由器,确切地说是互联网和客户端之间的防火墙

路由器创建一个映射以连接客户端计算机。客户端的本地IP和端口映射到外部IP(路由器通过ISP获得的IP)和外部端口(用于标识客户端进程)。本地IP和端口由路由器分配给客户端。这称为网络地址转换(NAT)

路由器维护一个路由表,将数据包从源路由到目的地

默认情况下,它允许所有TCP数据包在成功连接后进入或离开系统

但对于UDP数据包,路由器只允许传出数据包(从网络到其他网络的数据包)并阻止传入数据包

它只允许来自这些地址的UDP数据包进入网络,该网络由客户端先前向其发送数据包(因为发送数据包会在路由器表中创建一个条目)。换句话说,路由器只允许其IP和端口条目在路由表中可用的数据包

示例

考虑连接到路由器的客户端计算机“a”。让路由器 具有ISP提供的外部IP w.x.y.z。当客户端 启动UDP数据包,让路由器为其分配一个外部端口,例如 为了到达客户机,路由器将为其分配一个本地IP,比如192.168.1.62和一些端口3790(或由客户机定义) 路由器创建此内部或本地IP的映射 和端口分别连接到外部IP和端口。这可以是 可能的映射:

外部IP:端口本地IP:端口
w、 x.y.z:55000192.168.1.62:3790
这取决于路由器使用的NAT方案的类型 让客户端从服务器外部的某台机器接收数据包 网络中,另一端的机器必须将数据包发送到 路由器分配的外部IP和客户端端口,同时 启动UDP数据包。然后路由器将其转发给 客户端的本地IP和端口

在您的情况下,您正在发送数据包,但这些数据包被位于internet和客户端之间的路由器阻止。您需要将数据包发送到客户端的外部IP和端口。

为此,您需要实现UDP打孔。尽管它不能保证在所有类型的NAT上都能工作

或者更好地说,请阅读更多关于网络条件的信息, 关于如何在路由器中进行这些映射等

以下是一些来源:


您已经做到了。问题是什么?问题是我所做的代码只在本地主机和一台机器上工作(在netbeans输出中测试),当我在不同的机器上运行应用程序时,客户端不会显示任何输出,这让我认为我所做的代码不正确。谢谢你,Kunjan!你的回答非常解释了UDP通信如何通过不同的网络工作,但在我的情况下,这不是一个问题,因为我在局域网中工作。此外,网络由于我已经使用TCP和UDP协议完成了其他简单的应用程序,所以工作正常。再次感谢您抽出时间!
DatagramSocket socketCliente = new DatagramSocket();       
InetAddress[] IP = InetAddress.getAllByName(socketLigacao.getInetAddress().getHostAddress());   
byte[] enviaMensagem = new byte[1024];        
enviaMensagem = mensagemCliente.getBytes();
for (int i = 0; i < IP.length; i++){
DatagramPacket enviaPacote = new DatagramPacket(enviaMensagem, enviaMensagem.length, IP[i],     3790);
socketCliente.send(enviaPacote)
External IP:port    <-------------->    Local IP:port

   w.x.y.z:55000    <-------------->    192.168.1.62:3790