gpt4 book ai didi

java - 如何使用 Java MulticastSocket (UDP)?

转载 作者:行者123 更新时间:2023-12-03 11:55:21 27 4
gpt4 key购买 nike

我开发客户端-服务器应用程序,实时工作。服务器和客户端通过小消息交换,所以我选择 UDP 作为我的体系结构(正如网络中许多文章所建议的那样)。使用默认 java 的 DatagramSocket/DatagramPacket 来组织所有我想要的东西对我来说不是问题,但是当我阅读文档时,我看到了“MulticastSocket”机会。但我完全不清楚:用户端的 MutlicastSocket 如何知道连接到哪里? (服务器的公共(public) IP/端口)。真的,正如官方 java tutorial 所示.MulticastSocket 创建如下:

MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName("203.0.113.0");
socket.joinGroup(group);

并且没有任何关于公共(public)服务器IP和端口的规范。什么是“203.0.113.0”?应用程序的音调可能会将某些内容发送到网络中的该地址,不是吗?

当我以常规(非多播)方式创建客户端时,我使用类似的东西:

DatagramSocket outputClientSocket = new DatagramSocket();
DatagramPacket outputPacket = new DatagramPacket(new byte[512],512,InetAddress.getByName("94.***.89.***"),9898);
...

哪里是“94.???.89.???”是我服务器的公共(public) IP 地址,9898 是我服务器的端口,它监听它。像那样:

DatagramSocket serverInputSocket = new DatagramSocket(9898);
DatagramPacket inputServerPacket = new DatagramPacket(new byte[512],512);
serverInputSocket.recieve(inputServerPacket);

收到东西后,我可以与客户建立联系,并为他回答一些东西,比如:

DatagramSocket socketForSpecificClient = new DatagramSocket();
InetAddress realClientAddress = inputServerPacket.getAddress();
int realClientPort = inputServerPacket.getPort();
DatagramPacket packetForSpecificClient = new DatagramPacket(new byte[512],512,realClientAddress,realClientPort);
socketForSpecificClient.send(packetForSpecificClient);

即使客户端没有公共(public) IP,这种方法也很有效。这对我来说是建立连接的绝对清晰的方式,但我不明白应该使用 MulticastSocket 的目的是什么?

最佳答案

组播在 IPv4 中通常不能跨网段工作。如果您的应用程序应该在 Internet 上运行(而不是例如仅在您控制的 Intranet 内),则您不能基于多播进行通信。

编辑:这里有一些关于这个主题的更多资源:

维基百科 IP multicast :

multicast services are generally not available to the average end-user

其他 Stackoverflow 问题 'UDP Multicast over the internet?' :

In general this is not possible since multicast packages aren't routed.

hardforum.com 上的讨论 'Does multicast work over the itnernet(sic)?' :

ISPs filter mutlicast you can't join a multicast stream over the internet.

这些只是谷歌搜索“在互联网上使用多播”时最初的几个结果。

地址范围 203.0.113.0/24 保留用于“文档和示例代码”,因此示例中的地址 203.0.113.0 不指向真正的端点。

如果您需要一个真实的、公共(public)的多播地址并且通过支持多播的 ISP 连接,您必须从 IANA registry 获得一个。 .任何人都可以向该 IP 地址发送(可能是伪造的)数据,这是对的,但是单播地址存在完全相同的问题。如果您在单播地址上提供服务,任何人都可以连接到该地址并向其发送数据。

关于java - 如何使用 Java MulticastSocket (UDP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36200420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com