借人气问个流媒体服务器设计的问题

时间:2021-05-24 19:21:58
     流媒体服务器,将一个文件流化后发给多个客户端。为了不丢包,我打算采用TCP基于阻塞模式发送,服务器
先发送int大小的数据,指明后面的数据流长度,再接着发送真正的数据流。客户端阻塞的先收int大小数据,再按该数据阻塞的收数据流。
    这个地方是不是不太适合用select之类的I/O复用模型,因为我感觉I/O服用其实也是放在一个线程内进行读写的,只不过何时读写应该是由内核通知的,这样的理解对吗?
     所以我感觉是不是这里用线程模型比较好,每个用户一个线程,但是这些线程怎么获取流化的数据,用锁吗?那是不是效率太低点,比如我流化的数据进入的回调函数,平均每40ms触发一次,难道要在回调的函数里
   
 void callback(char *data,int data_size)
{   
    //读锁住data
    for ( int i = 0 ; i < 线程总数 ; i ++ )
     {
        线程[i] 操作data; 
     }
     //读锁释放data
}

12 个解决方案

#1


按照你阻塞模型,有数据头,多客户端, 一个客户端一个线程,没错。效率是很低。至于你什么时候开始循环发送随你。

#2


多谢楼上的答复
我想确定下 这种模型是不是不太适合select这样的模型  因为我这些TCP应该都是长连接的
还有 我想问下  如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象

比如  外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?

#3


你设个存储流数据的队列。各个连接线程发完了就去队列里取。

#4


都是读数据,多个线程并发访问没有问题。

问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式

#5


楼上的 太谢谢你的回复了 
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入  旧数据被删除吧
但是每个线程  怎么读数据呢 
   比如 队列里的数据是
    d1 d2 d3 .... dn 
   线程A取数据取到d2了   线程B取到d1 还有线程C,线程D等
    那我怎么决定什么时候删除数据块d1呢?

#6


每个连接线程里各有个队列=。=

#7


你的回调就循环往队列里添加

#8


楼上的  谢谢你 
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗

#9


你可以不复制多分,用智能指针,把你流数据的指针,和大小。封装个消息或者结构体加到各个线程队列里即可。

简单点就复制多份吧。就是内存大点。

#10


好的  结贴了  多谢

#11


楼上的  用智能指针行吗
每个线程播放完自己队里里的数据 都会删除队列前的数据  如果有不同步的情况 
那不是会出现线程A删除了线程B要用的数据?

#12


你搜索下智能指针的使用目的就会明白的。 智能指针也不需要你亲自去delete,多个人使用一个流数据,只有最后一个人用完了才自动的delete

#1


按照你阻塞模型,有数据头,多客户端, 一个客户端一个线程,没错。效率是很低。至于你什么时候开始循环发送随你。

#2


多谢楼上的答复
我想确定下 这种模型是不是不太适合select这样的模型  因为我这些TCP应该都是长连接的
还有 我想问下  如果这种模式发送的很慢 数据处理的比数据产生的还要慢 会产生什么现象

比如  外面的调用函数 每40毫秒调用一次callback,但是callback要50毫秒才返回,这时,是不是外面的调用函数就出问题了?

#3


你设个存储流数据的队列。各个连接线程发完了就去队列里取。

#4


都是读数据,多个线程并发访问没有问题。

问题是阻塞方式,性能上是个问题。客户端数量少还好,数量大的话,最好是异步模型。好歹上个select模式

#5


楼上的 太谢谢你的回复了 
我争取马上结贴
你说的这个 我可以做一个队列来试试
这个队列应该是不断的有新数据进入  旧数据被删除吧
但是每个线程  怎么读数据呢 
   比如 队列里的数据是
    d1 d2 d3 .... dn 
   线程A取数据取到d2了   线程B取到d1 还有线程C,线程D等
    那我怎么决定什么时候删除数据块d1呢?

#6


每个连接线程里各有个队列=。=

#7


你的回调就循环往队列里添加

#8


楼上的  谢谢你 
你的意思 是把原来的数据源,也就是一个视频文件流化后的数据源复制多份,分别往每个线程的队列里插入吗

#9


你可以不复制多分,用智能指针,把你流数据的指针,和大小。封装个消息或者结构体加到各个线程队列里即可。

简单点就复制多份吧。就是内存大点。

#10


好的  结贴了  多谢

#11


楼上的  用智能指针行吗
每个线程播放完自己队里里的数据 都会删除队列前的数据  如果有不同步的情况 
那不是会出现线程A删除了线程B要用的数据?

#12


你搜索下智能指针的使用目的就会明白的。 智能指针也不需要你亲自去delete,多个人使用一个流数据,只有最后一个人用完了才自动的delete