java中实现组播发送过快,接收丢失严重问题

wufei_wu 2017-12-26 08:11:08
用java中MulticastSocket实现了一个组播接收发送功能,公司内网里,在组播数据量比较大的时候发现发送端发送数据很快,但是接收端接收组播就很不规律,刷新也很慢。后来在发送端每次发送后进行了sleep(0,10),其实我也知道sleep肯定不会这么短,又不是实时操作系统,但是这样做确实能让cpu发送数据减缓。然后接收端就很正常的接收数据了。但是这样做就会使数据进行挤压,发送不及时,我就想到了用多线程来发送这些数据,果然起了两个组播线程之后数据接收正常,数据也没了挤压。
拜托公司大神帮忙用wireshark抓了下包,发现没有sleep的线程里,数据几乎是平均间隔5微秒发送,加了sleep起了两个线程之后,两个数据间隔大约在100微秒左右。
非常奇怪这是什么原因啊?为什么发送端发送过快还会使接收端出问题啊?另外,加sleep这个感觉很不好,有什么比较好的解决方案么?
...全文
328 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2018-01-05
  • 打赏
  • 举报
回复
MulticastSocket 是组播,UDP的一种,特点就是“非可靠传输”。 如果单一通讯信道发送过快,导致网路上任何设备处理不及时(导致缓冲池满等),都会被直接丢弃且不做任何补偿。 接收端也是如此,操作系统从网卡接收到UDP包后,直接进入操作系统准备的网络缓冲池(按通讯信道分配的),如果满了还没有应用接收掉就直接丢弃后续封包。
wufei_wu 2017-12-27
  • 打赏
  • 举报
回复
接收端是部署在另外一台机器上的,性能也不差,为什么会出现数据丢失严重现象呢?
oyljerry 2017-12-27
  • 打赏
  • 举报
回复
引用 2 楼 wufei_wu 的回复:
接收端是部署在另外一台机器上的,性能也不差,为什么会出现数据丢失严重现象呢?
你要看是不是数据包都还没发送到接收端,估计发送太快,发送端性能就跟不上
oyljerry 2017-12-26
  • 打赏
  • 举报
回复
如果你持续发送大量数据,自然就会影响当前的数据接收处理。CPU。内存。网卡都会有资源抢占。加入sleep就可以让出一些CPU等资源

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧