openresty实现websocket的全双工接收推送

很早就知道春哥有这个 lua-resty-websocket 的包了,可以让openresty具备websocket的通信能力,一直也以为这个包和node.js或者golang等其他语言的websocket包一样好用,可以很容易的实现全双工的操作,单播,多播,广播等功能。

但是事实证明,我的想法错误了,简单的搭建了 openresty 的websocket服务之后,发现我们只能进行简单的单播,甚至我一开始连挂起连接,等待客户端继续发送消息都不会。至于想要根据其他数据源来主动推送给某个链接,更加不敢想了。

我们需要解决的问题就是,如何挂起连接,让or能够持续的接受客户端的ws消息,并作出不同的响应。比如,发送一个ping,我响应一个pong,发送一个hello,我响应一个world之类的。

代码其实很简单,只需要在春哥的示例代码上加一段 while 1 do … end 即可,如下:

while 1 do
local data, typ, err = wb:recv_frame()

end

这个 wb:recv_frame() 方法会自动帮我挂起链接,非阻塞式的挂起,这样我们就能够持续的接收客户端的消息。