【问题标题】:How to send an UDP message for an array of clients (java)如何为一组客户端发送 UDP 消息(java)
【发布时间】:2014-12-30 14:05:04
【问题描述】:

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

任何帮助都将不胜感激,如果您需要更多信息,请告诉我。

干杯!

【问题讨论】:

  • 你已经做到了。有什么问题?
  • 问题是我所做的代码只能在 localhost 和一台机器上工作(在 netbeans 输出中测试),当我在不同的机器上运行应用程序时,客户端不显示任何输出,这让我认为我做的代码不正确

标签: java sockets tcp udp


【解决方案1】:

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

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

这在您使用 localhost 时有效,因为客户端 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 和端口。

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

您需要为此实现 UDP 打孔。虽然它不能保证适用于所有类型的 NAT。

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

以下是一些来源:

Network Address Translation

UDP Hole Punching

RFC 4787 NAT Behavioral Requirements UDP

RFC 5128 P2P across NAT

【讨论】:

  • 谢谢昆扬!您的回答非常说明 UDP 通信如何通过不同的网络进行工作,但就我而言,这不是问题,因为我在局域网中工作。此外,网络运行良好,因为我使用 TCP 和 UDP 协议完成了其他简单的应用程序,并且这些应用程序运行正常。再次感谢您的宝贵时间!
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2013-04-16
  • 2016-08-13
  • 2015-07-13
相关资源
最近更新 更多