构建通过websocket接收传入连接的服务器的最简单方法是什么,并将该套接字中流动的数据流式传输到其他websockets上的n
订阅者。想想流媒体应用程序的例子,其中一个人正在向n
个消费者广播。
忽略身份验证之类的东西,构建可以实现此目的的服务器最简单的方法是什么?我对一大块数据到达服务器时会发生什么感到困惑。它将进入内存中的缓冲区,然后如何将其分发给等待它的n
个消费者?某种循环缓冲? websockets是否适合此协议?谢谢。
答案 0 :(得分:1)
这是一个使用Ruby Plezi framework(我是作者,所以我有偏见):
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
您可以使用Ruby终端(irb
)对其进行测试 - 就这么简单。
我使用Websocket.org echo test使用两个浏览器窗口测试了连接,一个是“流式”,另一个是监听。
使用ws:// localhost:3000 / streamer进行流媒体websocket连接
使用ws:// localhost:3000 /作为客户端的连接。
魔法发生在IO核心,我把它放在一个名为Iodine的单独的Ruby gem(Ruby库被称为'gems')中。
Iodine利用Ruby的面向对象方法(在Ruby中,一切都是对象)来处理广播。
挖掘that piece of the code is here的一个很好的切入点。当您遇到方法each
时,请注意它是从the core Protocol继承并使用从IO map派生的数组。
Iodine的websocket实现遍历IO处理程序数组(value
映射的key=>value
一半),如果IO处理程序是Websocket,它会将消息“广播”到该IO处理程序由invoking the on_broadcst
callback。回调被调用asynchronously和locks the IO handler while being executed,以避免冲突。
Plezi leverages Iodine's broadcast
method并使用相同的概念,以便the on_broadcast
callback过滤掉不相关的消息。
出于性能原因,单播的工作方式稍有不同,但它大致相似。
我很抱歉在我的代码中使用了很多简写...我猜之前的Ruby习惯。我经常使用condition ? when_true : when_false
速记,并倾向于将东西压成单行......但它应该大部分都是可读的。