纯lua实现websocket,基于luawebsocket,love2d可用

参考文章

核心代码

local mask_key = {1, 14, 5, 14}
local function send(sock, opcode, message)
    -- message type
    sock:send(string.char(bor(0x80, opcode)))

    -- empty message
    if not message then
        sock:send(string.char(0x80, unpack(mask_key)))
        return 0
    end

    -- message length
    local length = #message
    if length>65535 then
        sock:send(string.char(bor(127, 0x80),
            0, 0, 0, 0,
            band(shr(length, 24), 0xff),
            band(shr(length, 16), 0xff),
            band(shr(length, 8), 0xff),
            band(length, 0xff)))
    elseif length>125 then
        sock:send(string.char(bor(126, 0x80),
            band(shr(length, 8), 0xff),
            band(length, 0xff)))
    else
        sock:send(string.char(bor(length, 0x80)))
    end

    -- message
    sock:send(string.char(unpack(mask_key)))
    local msgbyte = {message:byte(1, length)}
    for i = 1, length do
        msgbyte[i] = bxor(msgbyte[i], mask_key[(i-1)%4+1])
    end
    return sock:send(string.char(unpack(msgbyte)))
end

local function read(ws)
    local sock = ws.socket
    local res, err, part
    if ws.remain>0 then
        local res, err, part = sock:receive(ws.remain)
        if part then
            -- still some bytes remaining
            ws.buffer, ws.remain = ws.buffer..part, ws.remain-#part
            return nil, nil, "pending"
        else
            -- all parts recieved
            ws.buffer, ws.remain = ws.buffer..res, 0
            return ws.buffer, ws.head, nil
        end
    end
    -- byte 0-1
    res, err = sock:receive(2)
    if err then return res, nil, err end
    local head = res:byte()
    -- Moved to _M:update
    -- local flag_FIN = res:byte()>=0x80
    -- local flag_MASK = res:byte(2)>=0x80
    local byte = res:byte(2)
    local length = band(byte, 0x7f)
    if length==126 then
        res = sock:receive(2)
        local b1, b2 = res:byte(1, 2)
        length = shl(b1, 8) + b2
    elseif length==127 then
        res = sock:receive(8)
        local b5, b6, b7, b8 = res:byte(5, 8)
        length = shl(b5, 24) + shl(b6, 16) + shl(b7, 8) + b8
    end
    if length==0 then return "", head, nil end
    res, err, part = sock:receive(length)
    if part then
        -- incomplete frame
        ws.head = head
        ws.buffer, ws.remain = part, length-#part
        return nil, nil, "pending"
    else
        -- complete frame
        return res, head, err
    end
end

完整程序

Github

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值