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

时间:2014-12-29 17:37:30

标签: java sockets tcp udp

我的问题是如何为一个阵列发送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输出中测试),当我在不同的机器上运行时,客户端没有显示任何输出,我确信问题出现在这部分代码中我张贴...

如果有任何帮助需要更多信息,请告诉我。

干杯!

1 个答案:

答案 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。

  

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

以下是一些消息来源:

Network Address Translation

UDP Hole Punching

RFC 4787 NAT Behavioral Requirements UDP

RFC 5128 P2P across NAT