Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 多播数据开销?_Java_Sockets_Networking_Udp_Multicast - Fatal编程技术网

Java 多播数据开销?

Java 多播数据开销?,java,sockets,networking,udp,multicast,Java,Sockets,Networking,Udp,Multicast,我的应用程序使用UDP的多播功能 简而言之,我使用java,希望使用单个多播地址和端口传输所有数据。尽管多播侦听器在逻辑上将被划分为子组,这些子组可以在运行时更改,并且可能不希望处理来自其组之外的数据 为了实现这一点,我编写了代码,以便应用程序的所有运行实例都将加入相同的多播组和端口,但会仔细观察数据包的发送方,以确定它是否属于它们的子组 警告:我的应用程序的最小数据包大小为30000-60000字节 将使用MulticastSocket.receive(DatagramPacket)读取每个数

我的应用程序使用UDP的多播功能

简而言之,我使用java,希望使用单个多播地址和端口传输所有数据。尽管多播侦听器在逻辑上将被划分为子组,这些子组可以在运行时更改,并且可能不希望处理来自其组之外的数据

为了实现这一点,我编写了代码,以便应用程序的所有运行实例都将加入相同的多播组和端口,但会仔细观察数据包的发送方,以确定它是否属于它们的子组

警告:我的应用程序的最小数据包大小为30000-60000字节

将使用MulticastSocket.receive(DatagramPacket)读取每个数据包,并确定所需数据包是否会导致过多开销(甚至缓冲区溢出)


它会不会因为每个数据包都发送给每个人而导致网络拥塞?每个数据包都可能发送给每个人,但每个数据包只会在网络上出现一次


然而,除非这个应用程序完全在一个完全由您控制的局域网(包括所有路由器)中运行,否则它已经不可行了。一旦通过不受控制的路由器,通常可接受的最大UDP数据报大小为534。

并非每个数据包都发送给每个人,因为多播(例如PIM)将构建一个多播树,以最佳方式放置接收器和发送器。因此,在需要时复制数据包的网络。在最后一跳广播多播数据包(技术上更准确,在第2层被淹没)。IGMP在最后一跳协助多播,并确保如果在最后一跳中没有接收器加入,则不会进行此类泛洪


“并且可能不希望处理来自组外的数据。”接收呼叫将返回下一个接收到的数据报,因此无法避免处理不用于子组分类的数据包。您的应用程序不能使用不同的多个组吗?

我可能可以减少数据包大小,是的,所有数据都在专用WLAN中,但我主要担心的是,它会不会造成拥塞,因为路由器会复制几乎相同的数据并将其发送到加入组的每个设备。因此,如果局域网中有100台设备,那么它不会导致拥塞吗?不会,因为每个数据包只在每个子网上出现一次,并且根本不会出现,除非其中或之外有多播侦听器。这就是多播的全部意义。如果100个RCeiver加入同一个组,你能澄清你的评论吗。即使有大量的接收器,多播的基本部分也会继续工作,所以100个接收器仍然可以。IGMP在每一跳都会提供帮助。如果另一端没有接收器,则数据报不会传播。使用如此大的数据包,您更有可能超过网络设备/适配器的缓冲区大小。许多连接只有几MB的内存,并且系统上有其他流量,很可能会经常导致缓冲区溢出。我建议您编写应用程序来处理相当高的退出率。另一种选择是将这些数据包拆分成更小的数据包,传输它们,然后在接收器处重新组装它们!