Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
服务器架构:websocket多播服务器?_Websocket_Streaming_Live Streaming - Fatal编程技术网

服务器架构:websocket多播服务器?

服务器架构:websocket多播服务器?,websocket,streaming,live-streaming,Websocket,Streaming,Live Streaming,构建通过websocket接收传入连接并将流入该套接字的数据流输出到其他websocket上的订户的服务器的最简单方法是什么。以流媒体应用程序为例,其中一个人正在向n消费者广播 忽略身份验证之类的事情,构建能够实现这一点的服务器的最简单方法是什么?我有点困惑,当一大块数据进入服务器时会发生什么。它将进入内存中的缓冲区,然后如何将其分配给等待它的n消费者?某种循环缓冲区?websockets是一个合适的协议吗?谢谢 这里有一个使用Ruby的(我是作者,所以我有偏见): 你可以用Ruby终端(irb

构建通过websocket接收传入连接并将流入该套接字的数据流输出到其他websocket上的订户的服务器的最简单方法是什么。以流媒体应用程序为例,其中一个人正在向
n
消费者广播

忽略身份验证之类的事情,构建能够实现这一点的服务器的最简单方法是什么?我有点困惑,当一大块数据进入服务器时会发生什么。它将进入内存中的缓冲区,然后如何将其分配给等待它的
n
消费者?某种循环缓冲区?websockets是一个合适的协议吗?谢谢

这里有一个使用Ruby的(我是作者,所以我有偏见):

你可以用Ruby终端(
irb
)来测试它——就是这么简单

我用两个浏览器窗口测试了连接,一个是“流”,另一个是监听

  • 使用ws://localhost:3000/streamer进行拖缆websocket连接

  • 使用ws://localhost:3000/进行客户端连接

编辑(与您对库和体系结构的评论相关) 神奇发生在IO内核中,我将其放在一个单独的RubyGem(RubyLibraries称为“gems”)中,名为

Iiod利用Ruby的面向对象方法(在Ruby中,一切都是对象)来处理广播

这是一个很好的切入点。当遇到方法
each
时,请注意它是从继承的,并使用从派生的数组

Idio的websocket实现在IO处理程序数组中进行迭代(键映射的
值的
一半),如果IO处理程序是websocket,它将通过“广播”消息到该IO处理程序。调用回调函数并调用它,以避免冲突

Plezi和Plezi使用相同的概念,以便过滤掉不相关的消息

由于性能原因,单播的工作原理略有不同,但基本上是相似的

我很抱歉在我的代码中使用了很多速记。。。我想是红宝石前的习惯吧。我使用
条件?when_true:when_false
大量速记,并倾向于将内容压缩成单行。。。但它应该是可读的


祝你好运

嘿!谢谢你的回答。我更感兴趣的是如何设计这个问题的解决方案,而不是如何用特定的语言实现它。期待着挖掘你的图书馆,看看你是如何做到的。谢谢。@bcattle-非常欢迎你。我用代码相关部分的链接更新了答案,以便于深入研究,并试图简要概述该体系结构。。。该体系结构在很大程度上依赖于Ruby实现的OOP模型。我相信它可以用C++来做,也可以用RUID和其他OOP语言,但我不确定它会这么容易。Javascript原型和动态类型可以实现类似的体系结构,但是。。。嗯,我想javascript比C好。如果您的代码从不阻塞繁重的任务,单线程通常会更快。
require 'plezi'

class Client
   # Plezi recognizes websocket handlers by the presence of the
   # `on_message` callback.
   def on_message data
      true
   end
   protected
   # this will be out event.
   def publish data
      write data
   end
end

class Streamer
   def on_message data
      Client.broadcast :publish, data
   end
end

# the streamer will connect to the /streamer path
route '/streamer', Streamer

# the client will connect to the /streamer path
route '/', Client

# on irb, we start the server by exiting the `irb` terminal
exit