Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java MulicastSocket(UDP)?_Java_Sockets_Network Programming_Udp_Multicastsocket - Fatal编程技术网

如何使用Java MulicastSocket(UDP)?

如何使用Java MulicastSocket(UDP)?,java,sockets,network-programming,udp,multicastsocket,Java,Sockets,Network Programming,Udp,Multicastsocket,我开发客户机-服务器应用程序,实时工作。服务器和客户端通过小消息进行交换,所以我选择UDP作为我的体系结构(正如网络中的许多文章所建议的)。 使用默认java的DatagramSocket/DatagramPacket来组织我想要的所有东西对我来说不是问题,但是当我阅读文档时,我看到了“MulticastSocket”的机会。 但我完全不清楚:用户端的MutlicastSocket如何知道连接到哪里?(服务器的公共IP/端口)。真的,正如在这个官方java上所显示的。 多播套接字创建如下内容:

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

MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName("203.0.113.0");
socket.joinGroup(group);
目前还没有关于公共服务器IP和端口的任何规范。 什么是“203.0.113.0”?应用程序的音调可能会向web中的那个地址发送某些内容,不是吗

当我以常规(非多播)方式创建客户端时,我会使用以下内容:

DatagramSocket outputClientSocket = new DatagramSocket();
DatagramPacket outputPacket = new DatagramPacket(new byte[512],512,InetAddress.getByName("94.***.89.***"),9898);
...
其中“94.?.89.?”是我的服务器的公共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);
即使客户端没有公共IP,这种方法也能很好地工作。
这对我来说是建立连接的绝对清晰的方法,但我不明白多播套接字应该用于什么目的?

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

编辑:以下是有关该主题的更多资源:

维基百科:

多播服务通常对普通终端用户不可用

其他问题:

通常这是不可能的,因为多播包没有路由

hardforum.com上的讨论:

ISPs筛选器多播您不能通过internet加入多播流

这些只是谷歌搜索“使用互联网上的多播”时的第一批点击数

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


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

引用本书中的段落来构建答案:

用户端的MutlicastSocket如何知道连接到哪里? (服务器的公共IP/端口)

什么是“203.0.113.0”?应用程序的音调可能会发送 网络上那个地址的东西,不是吗

首先,您通常应该使用介于225.0.0.0到238.255.255.255之间的IP地址来创建新的多播组

当主机想要向多播组发送数据时,它会将该数据放入多播数据报中,这些数据报只不过是指向多播组的UDP数据报。多播数据通过UDP发送

多播地址是称为多播组的一组主机的共享地址。IPv4多播地址是CIDR组224.0.0.0/4中的IP地址(即,它们的范围从224.0.0.0到239.255.255.255)

多播组是共享多播地址的一组Internet主机。发送到多播地址的任何数据都会中继到组的所有成员。多播组中的成员资格是开放的;主机可以随时进入或离开该组。组可以是永久的,也可以是暂时的。IANA负责根据需要分发永久多播地址


多播将数据从一个主机发送到多个不同的主机,但不是每个主机;数据只会发送给通过加入特定多播组而表示感兴趣的客户端。在某种程度上,这就像一次公开会议。人们可以随心所欲地来来去去,当他们对讨论不再感兴趣时就离开。在他们到达之前和离开之后,他们根本不需要处理这些信息:这些信息无法到达他们手中。在互联网上,此类“公开会议”最好使用多播套接字来实现,该套接字将数据副本发送到靠近声明对数据感兴趣的各方的位置(或一组位置)

在最好的情况下,只有当数据到达为感兴趣的客户端服务的本地网络时,数据才会被复制:数据只在互联网上传输一次。更现实地说,互联网上有几份相同的数据副本;但是,通过仔细选择复制流的点,网络上的负载最小化。好人 新闻是程序员和网络管理员不负责选择复制数据的点,甚至不负责发送多个副本;互联网的路由器处理所有这些


要从远程站点接收正在进行多播的数据,请首先使用MulticastSocket()构造函数创建一个MulticastSocket。与其他类型的套接字一样,您需要知道要侦听的端口。此代码片段打开侦听端口2300的多播套接字:

MulticastSocket ms = new MulticastSocket(2300);
接下来,使用MulticastSocket的joinGroup()方法加入多播组:

这会向您和服务器之间路径中的路由器发出信号,开始按您的方式发送数据,并告诉本地主机它应该将IP数据包传递给多播组。 加入多播组后,您将收到UDP数据,就像使用DatagramSocket一样

应用程序的音调可能会向该应用程序发送某些信息 网络地址,不是吗

即使在单播通信的情况下,人们也会面临同样的问题
InetAddress group = InetAddress.getByName("225.2.2.2");
ms.joinGroup(group);