我的问题是如何为一个阵列发送UDP消息,其中包含一个连接到TCP套接字的服务器的IP列表?
我做的代码(只是服务器应用程序,发送部分):
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)
我所做的代码只是在localhost中工作(在netbeans输出中测试),当我在不同的机器上运行时,客户端没有显示任何输出,我确信问题出现在这部分代码中我张贴...
如果有任何帮助需要更多信息,请告诉我。
干杯!
答案 0 :(得分:2)
您的代码是正确的。 问题出在网络上。
在您当前的代码中,您尝试将UDP数据包发送到相应IP地址和端口的多个客户端(3790)。
当您使用localhost时,这是有效的,因为客户端IP和端口未映射到其他IP地址。 当您在本地主机上时,您只需使用本地IP和本机端口进行播放。
在实际情况中,情况有所不同。客户端连接到路由器,恰好是互联网和客户端之间的防火墙。
路由器创建映射以覆盖客户端计算机。客户端的本地IP和端口映射到外部IP(路由器由ISP获取的IP)和外部端口(标识客户端进程)。本地IP和端口由路由器分配给客户端。这称为网络地址转换(NAT)。
路由器维护一个路由表,用于将数据包从源路由到目的地。
默认情况下,它允许所有TCP数据包在成功连接后进入或离开系统。
但是在UDP数据包的情况下,路由器只允许传出数据包(数据包离开网络到其他网络)并阻止传入数据包。
它允许仅来自这些地址的UDP数据包进入网络,客户端更早地向其发送数据包(因为发送数据包会在路由器表中创建一个条目)。换句话说,路由器只允许那些IP和端口条目在路由表中可用的数据包。
示例:
考虑连接到路由器的客户端计算机“A”。让路由器 有一个由ISP提供的外部IP w.x.y.z.当客户端 发起一个UDP数据包,让路由器为它分配一个外部端口说 55000.要到达客户端计算机,路由器将分配一个本地IP说192.168.1.62和一些端口3790(或由客户端定义) 处理)。路由器创建此内部或本地IP的映射 并分别端口到外部IP和端口。这可以是一个 可能的映射:
External IP:port <--------------> Local IP:port
w.x.y.z:55000 <--------------> 192.168.1.62:3790
这取决于路由器使用的NAT方案的类型。所以,按顺序 让客户端从外部的某台机器接收数据包 网络,另一边的机器必须发送数据包到 路由器分配的客户端的外部IP和端口 启动UDP数据包。路由器然后将它转发到 本地IP和客户端端口。
在您的情况下,您正在发送数据包,但这些数据包被互联网和客户端之间的路由器阻止。 您需要将数据包发送到客户端的外部IP和端口。
您需要为此实施 UDP打孔。虽然它不能保证适用于所有类型的NAT。
或者更好地说,请阅读有关网络条件的更多信息, 关于如何在路由器等中完成这些映射
以下是一些消息来源: