构建一个服务器的最简单方法是什么?该服务器通过网络套接字接收传入连接,并将流入该套接字的数据流式传输到其他网络套接字上的n
订阅者。以流媒体应用程序为例,其中一个人正在向n
消费者广播。
忽略身份验证之类的事情,构建一个能够实现这一点的服务器的最简单方法是什么?我有点困惑,当一大块数据到达服务器时会发生什么。它将进入内存中的缓冲区,然后如何将其分配给等待它的n
消费者?某种循环缓冲区?websocket是一个合适的协议吗?谢谢
这里有一个使用Ruby Plezi框架的框架(我是作者,所以我有偏见):
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回声测试测试了两个浏览器窗口的连接,一个是"流媒体",另一个是监听。
使用ws://localhost:3000/streamer进行流媒体websocket连接
使用ws://localhost:3000/作为客户端的连接。
编辑(与您对图书馆和建筑的评论有关)
神奇的事情发生在IO核心,我把它放在一个单独的Ruby gem(Ruby库被称为"gem")中,名为碘。
碘利用Ruby的面向对象方法(在Ruby中,一切都是一个对象)来处理广播。
这里是深入研究这段代码的一个很好的切入点。当您遇到方法each
时,请注意它是从核心协议继承的,并使用从IO映射派生的Array。
碘的websocket实现遍历IO处理程序数组(key=>value
映射的value
的一半),如果IO处理程序是websocket,它将通过调用on_broadcst
回调将消息"广播"给该IO处理程序。回调是异步调用的,它在执行时锁定IO处理程序,以避免冲突。
Plezi利用了碘的broadcast
方法,并使用了相同的概念,因此on_broadcast
回调将过滤掉不相关的消息。
由于性能原因,单播的工作方式略有不同,但基本上是相似的。
很抱歉在我的代码中使用了很多简写。。。我想是Ruby之前的习惯。我经常使用condition ? when_true : when_false
的简写,倾向于把东西压缩成单行。。。但它应该是可读的。
祝你好运!