关于局域网内的1对多通信(Socket)

千年壹契 2018-05-10 10:40:06
大概这样一个DEMO:
PC机,PAD主机 ----以下简称PADM, N个PAD---以下简称PADC
PADM 与 PC机建立Socket通信,并向PC发送H264视频流数据
PC机得到数据后,转发给PADC,PADC展示 PAD主机投放的内容。

方案:PC机建立Socket服务,PADM和PADC连接服务。由PADM发送数据,PC服务负责转发。所有PADC在建立连接的时候会有一个队列,用于存储转发数据,当PC接收到H264流之后,直接仍到所有PADC链接的队列里面,链接里面开了一个线程,将队列数据发送出去。

最初的时候,只有几台PADC,一切正常,基本同步显示PADM的发送数据,但随着PADC的增多,网络上行 撑不住了。一直处于发送数据状态,且占满了网络。考虑了压缩H264字节流之后再转发,但H264已经压缩过了,30000个字节的包最多能压缩成28000字节(平均下来每个包能压缩 200~500 个字节)
因为产品要求即时,且在同一局域网内,所以没有选择客户端主动下拉的方案(直播就是主动下拉)。

求与大神讨论一下优化方案和其他解决方案 同发展 共进步
...全文
734 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2018-05-11
  • 打赏
  • 举报
回复
买硬件多配服务器。按你实情况去算。现在的硬件能不能支持的了。如果都支持不了,讨论是没有意义的。
  • 打赏
  • 举报
回复
随便预估一个分布式的网络架构吧。比如说有一段编号为 92399239494 的数据,它可能在 n1 或者 n2 或者......n100 机器上,当某个客户端需要这个数据时,问 master 机器要一下这个数据到底在哪台机器上,然后直接去取就行了。你所说的发送、队列等概念,只是最初的自顶向下地单线程处理和数据复制的思路,没有任何变化和架构的需求。
  • 打赏
  • 举报
回复
比如说,为啥要弄许多队列用来保存冗余的数据?为啥要弄不死的(不结束的)线程来占满CPU调度时间?为啥要通过网络传很多份相同的数据? 这些能砍掉的都应该砍掉。首先砍掉队列概念(服务器端的 .net 线程池机制本身就是一个队列,你用不着再自己发明什么队列来延迟程序),然后砍掉复制多份数据概念,应该就重新设计出来差不多了的方案了。
  • 打赏
  • 举报
回复
你所谓的“建了一个队列、开了一个线程”的说法,其实说白了,就是用一个线程阻塞式地处理业务。看似使用了多线程技术了,其实是单线程阻塞式地去处理业务。不卡才怪。
liwen9016 2018-05-10
  • 打赏
  • 举报
回复
引用 4 楼 c171730524 的回复:
[quote=引用 3 楼 liwen9016 的回复:] 组播 或者 广播不就OK?
不吃网络上行吗?我看下原理先,以前没弄过 一直做的TCP[/quote] 1对多,如果过路由就用组播,不过路由的局域网就广播。 建议组播。没问题哒
liwen9016 2018-05-10
  • 打赏
  • 举报
回复
组播 或者 广播不就OK?
fd34gs3yf 2018-05-10
  • 打赏
  • 举报
回复
同发展 共进步 哈哈哈
千年壹契 2018-05-10
  • 打赏
  • 举报
回复
别沉啊,吐槽我没说清楚也行....
千年壹契 2018-05-10
  • 打赏
  • 举报
回复
引用 3 楼 liwen9016 的回复:
组播 或者 广播不就OK?
不吃网络上行吗?我看下原理先,以前没弄过 一直做的TCP
ForestDB 2018-05-10
  • 打赏
  • 举报
回复
h264相关的你不考虑rtsp?
千年壹契 2018-05-10
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
随便预估一个分布式的网络架构吧。比如说有一段编号为 92399239494 的数据,它可能在 n1 或者 n2 或者......n100 机器上,当某个客户端需要这个数据时,问 master 机器要一下这个数据到底在哪台机器上,然后直接去取就行了。你所说的发送、队列等概念,只是最初的自顶向下地单线程处理和数据复制的思路,没有任何变化和架构的需求。
至于分布式的网络架构的话 不符合产品的使用环境,产品使用是在同一局域网内,这个环境里面 只有 一台主机 一台路由器 和N个PAD
千年壹契 2018-05-10
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
比如说,为啥要弄许多队列用来保存冗余的数据?为啥要弄不死的(不结束的)线程来占满CPU调度时间?为啥要通过网络传很多份相同的数据? 这些能砍掉的都应该砍掉。首先砍掉队列概念(服务器端的 .net 线程池机制本身就是一个队列,你用不着再自己发明什么队列来延迟程序),然后砍掉复制多份数据概念,应该就重新设计出来差不多了的方案了。
CPU其实没占多少,最多也就吃50%左右,服务程序的内存也就300左右,一直都在释放。至于发送相同数据是因为需求所致,需要将一个pad显示的内容投影到其它pad 就是 投屏
  • 打赏
  • 举报
回复
队列、线程,甚至什么“生产者-消费者模式”这种名词儿,包含着许多错误的并发系统设计概念。其实20年前的许多电信级的并发分布式系统也比什么 java 书籍上的多线程管理的设计不知道高效和科学多少倍。大多数程序员都被早期 java、c++ 害过了。 这些年并发分布式系统越来越流行,有太多的应用已经用了6、7年了,所以技术已经成熟了。 那就是,多说分布式、对象、异步、路由等等概念,少提什么队列、消费者、单线程处理数据转发概念。
sp1234_maJia 2018-05-10
  • 打赏
  • 举报
回复
其实硬要主动“推送”(不管人家要不要)也是同样道理,我还是多说一次吧。当有一段数据编号了序号之后,问 master 机器要一下目标机器列表,包括中间缓存机器的地址,然后直接推给它们就行了。 数据其实就象是商品,每一个数据都是独立的并发的对象,管它队列不队列的呢?为啥总不忘“队列”概念呢?

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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