开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from 呵大官人/fooking
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
fooking
/
src
/
script.lua
fooking
/
src
/
script.lua
script.lua 4.89 KB
一键复制 编辑 原始数据 按行查看 历史
呵大官人 提交于 2015年06月26日 16:40 +08:00 . rename script handler name
--[[
fb是fooking buffer, 目前提供size, data, append, seek四个方法
fb.size(buffer) 返回buffer长度
fb.data(buffer) 返回buffer数据(string)
fb.append(buffer, "data") 向buffer追加数据
fb.seek(buffer, 10) 设置buffer向后偏移长度,
如: buffer数据为abcdef,长度为6, 设置seek(buffer, 2),那么buffer内容为cdef,并且长度为4
fc是fooking connection, 目前提供buffer,send两个方法
fc.buffer(conn) 返回conn的read buffer, 类型为lightuserdata
fc.send(conn, "hello") 向conn发送数据
fc.id() 获取客户端session id
input与output处理函数返回三种状态值,小于0, 等于0或大于0
小于0: 表示数据包不足,等待下次处理(output如果返回值小于0,则不返回任何数据到客户端)
等于0: 表示继续由fooking按原生协议处理(size+body),
大于0: 表示已经处理,数据由output返回
]]
local fb = require("fooking.buffer");
local fc = require("fooking.connection");
dofile("Sha1.lua")
function onConnect(conn)
print("new client, sid="..fc.id(conn))
end
function onClose(conn)
print("close client, sid="..fc.id(conn))
end
function onRead(conn, requestid, input, output)
local l = fb.size(input);
local s = fb.data(input);
fb.seek(input, l);
--fc.send(conn, "HTTP/1.1 OK\r\nConnection: keep-alive\r\nContent-Length: 11\r\n\r\nhello world");
if requestid == 0 then
--握手协议
local startpos = string.find(s, "Sec-WebSocket-Key: ", 1, true);
if not startpos then
print("not found Sec-WebSocket-Key");
return 1;
end
local endpos = string.find(s, "\r\n", startpos + 19 , true);
if not endpos then
print("Sec-WebSocket-Key is not invalid");
return 1;
end
local key = string.sub(s, startpos + 19, endpos - 1);
local rkey = base64Encode(Sha1(key.."258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
fc.send(conn, "HTTP/1.1 101 Switching Protocols\r\nConnection: Upgrade\r\nUpgrade: WebSocket\r\nSec-WebSocket-Accept: "..rkey.."\r\n\r\n");
else
local body = wsDecode(s);
fb.append(output, body);
end
return 1;
end
function onWrite(conn, requestid, input, output)
local l = fb.size(input);
local s = fb.data(input);
fb.seek(input, l);
local data = wsEncode(s);
fc.send(conn, data);
return 1;
end
function base64Encode(str)
local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
local s64 = ''
while #str > 0 do -- iterate through string
local bytes_num = 0 -- number of shifted bytes
local buf = 0 -- input buffer
for byte_cnt=1,3 do
buf = (buf * 256)
if #str > 0 then -- if string not empty, shift 1st byte to buf
buf = buf + string.byte(str, 1, 1)
str = string.sub(str, 2)
bytes_num = bytes_num + 1
end
end
for group_cnt=1,(bytes_num+1) do
b64char = math.fmod(math.floor(buf/262144), 64) + 1
s64 = s64 .. string.sub(b64chars, b64char, b64char)
buf = buf * 64
end
for fill_cnt=1,(3-bytes_num) do
s64 = s64 .. '='
end
end
return s64
end
function wsEncode(str)
local data = "";
--fin=1, rsv=000, opcode=0001
local fin = 1 << 7;
local rsv = 0;
local opc = 1;
data = data .. string.pack("B", fin | rsv | opc);
--length
local slen = #str;
local mask = 0;
if slen > 65535 then
data = data .. string.pack("B", 127 | mask) .. string.pack(">J", slen);
elseif slen > 125 then
data = data .. string.pack("B", 126 | mask) .. string.pack(">H", slen);
else
data = data .. string.pack("B", slen | mask);
end
--mask
--TODO
--body
data = data .. str;
return data;
end
function wsDecode(s)
--数据处理
local c1,c2 = string.byte(s, 1, 2);
local fin = c1 >> 7 & 0x1;
local rsv1 = c1 >> 6 & 0x1;
local rsv2 = c1 >> 5 & 0x1;
local rsv3 = c1 >> 4 & 0x1;
local opcode = c1 & 0xF;
local hashmask = c2 >> 7 & 0x1;
local length = c2 & 0x7F;
local mask = "";
if length == 126 then
if hashmask == 1 then
mask = string.sub(s, 5, 8);
end
local c3,c4 = string.byte(s, 3, 4);
length = c3 << 8 | c4;
elseif length == 127 then
if hashmask == 1 then
mask = string.sub(s, 11, 14);
end
local c3,c4,c5,c6,c7,c8,c9,c10 = string.byte(s, 3, 10);
length = (c3 << 56) | (c4 << 48) | (c5 << 40) | (c6 << 32) |
(c7 << 24) | (c8 << 16) | (c9 << 8) | c10;
elseif hashmask == 1 then
mask = string.sub(s, 3, 6);
end
local offset = 2;
--length offset
if length > 65535 then
offset = offset + 8;
elseif length > 125 then
offset = offset + 2;
end
--mask offset
if hashmask == 1 then
offset = offset + 4;
end
local body = "";
if hashmask == 1 then
local m1,m2,m3,m4 = string.byte(mask, 1, 4);
local marr = {m1, m2, m3, m4};
for i=1,length do
body = body .. string.char(string.byte(s, offset+i) ~ marr[(i-1)%4+1]);
end
else
body = string.sub(s, offset);
end
return body;
end
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

分布式游戏网关(php游戏网关, php游戏服务端)
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/nmred/fooking.git
git@gitee.com:nmred/fooking.git
nmred
fooking
fooking
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /