CF web Websocket應(yīng)用指南

2019-04-02 11:28 更新

介紹

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)找到.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號