Websocket什么? WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
cf的websocket協(xié)議層實現(xiàn)將其作為一種升級協(xié)議內(nèi)嵌到httpd庫內(nèi). 所以, 當(dāng)您使用httpd庫的時候即可很方便的使用websocket.
首先, 我們根據(jù)[cf web的初始化與使用](https://github.com/CandyMi/core_framework/wiki/QuickStart)最后的示例, 在```script/main.lua```文件內(nèi)添加一段代碼:
app:ws('/ws', require 'ws')
然后我們在```script```目錄建立一個```ws.lua```文件, 在其內(nèi)部添加如下代碼:
local class = require "class"
local timer = require 'internal.Timer'
local json = require "json"
local MQ = require "MQ"
local websocket = class("websocket")
function websocket:ctor(opt)
self.ws = opt.ws -- websocket對象
self.send_masked = false -- 掩碼(默認(rèn)為false, 不建議修改或者使用)
self.max_payload_len = 65535 -- 最大有效載荷長度(默認(rèn)為65535, 不建議修改或者使用)
self.timeout = 15
self.count = 0
self.mq = MQ:new({host = 'localhost', port = 6379, type = 'redis'})
end
function websocket:on_open()
print('on_open')
self.timer = timer.at(0.01, function ( ... ) -- 定時器
self.count = self.count + 1
self.ws:send(tostring(self.count))
end)
self.mq:on('/test/*', function (msg) -- 消息隊列
if not msg then
self.ws:send('{"code":500,"message":"無法連接到mq(reds)"}')
return self.ws:close()
end
self.ws:send(json.encode(msg))
end)
end
function websocket:on_message(data, typ)
print('on_message', self.ws, data)
self.ws:send('welcome')
self.ws:close(data)
end
function websocket:on_error(error)
print('on_error', self.ws, error)
end
function websocket:on_close(data)
print('on_close', self.ws, data)
if self.mq then -- 清理消息隊列
self.mq:close()
self.mq = nil
end
if self.timer then -- 清理定時器
self.timer:stop()
self.timer = nil
end
end
return websocket
上述所有代碼可以在
script
文件夾內(nèi)找到.
更多建議: