时间:2015-04-24 来源:

给skynet增加websocket模块【移动开发】

       最近迷上了skynet,代码质量很高,psd切图html算开源游戏服务器框架中的佼佼者,团队网页接活C++/Python的kbengine,还是nodejs的pomelo,skynet在并发上和商业应用都有很大的优势,div+css+js切图根据http://thislinux.com/blog/5_panic.html描述承接网站前端,skynet能支持单机3w在线用户,页面div重构性能很是给力.

    当客户端->close ->服务端psd切图html,服务端接收到opcode为8的close事件,psd切图html服务端发送close frame,然后关闭客户端socket

     1.lua-resty-websocket实在太老了,web外包现在已经是lua53的时代了

端确认的.

基于直接recv的方式

local skynet = require "skynet" local string = require "string" local crypt = require "crypt" local socket = require "socket" local httpd = require "http.httpd" local sockethelper = require "http.sockethelper" local urllib = require "http.url" local ws = {} local ws_mt = { __index = ws } local function response(id, ...) end local function write(id, data) end local function read(id, sz) end local function challenge_response(key, accept, check_origin, "Can \"Upgrade\" only to \"WebSocket\"." end -- Connection header should be upgrade. Some proxy servers/load balancers -- might mess with it. if not header["connection"] or not header["connection"]:lower():find("upgrade",true) then return 400, header["host"]) then return 403, "HTTP/1.1 Upgrade Required\r\nSec-WebSocket-Version: 13\r\n\r\n" end local key = header["sec-websocket-key"] if not key then return 400,", true) protocol = "Sec-WebSocket-Protocol: " .. protocol:sub(1, challenge_response(key, host) return urllib.parse(origin) == host end function H.on_open(ws) end function H.on_message(ws, code, data) -- Invoked when the response to a ping frame is received. end function ws.new(id, handler, { __index = H }) local code, conf.check_origin, code, result) end local self = { id = id, mask_outgoing = conf.mask_outgoing, ws_mt) end function ws:send_frame(fin, data) if fin then finbit = 0x80 else finbit = 0 end frame = string.pack("B", l | mask_bit) elseif l < 0xFFFF then frame = frame .. string.pack("!BH", l) else frame = frame .. string.pack("!BL", l) end if self.mask_outgoing then end frame = frame .. data write(self.id, 0x1, 0x2, 0x9, 0xA, reason) -- 1000 "normal closure" status code if code == nil and reason ~= nil then code = 1000 end local data = "" if code ~= nil then data = string.pack(">H", 0x8, final, message end if final then data = data .. message break else data = data .. message end end self.handler.on_message(self, data, length do umasked[i] = string.char(string.byte(data, (i-1)%4 + 1)) end return table.concat(umasked) end function ws:recv_frame() local data, 2) if not data then return false, "Read first 2 byte error: " .. err end local header, data) local final_frame = header & 0x80 ~= 0 local reserved_bits = header & 0x70 ~= 0 local frame_opcode = header & 0xf local frame_opcode_is_control = frame_opcode & 0x8 ~= 0 if reserved_bits then -- client is using as-yet-undefined extensions return false, "Reserved_bits show using undefined extensions" end local mask_frame = payloadlen & 0x80 ~= 0 payloadlen = payloadlen & 0x7f if frame_opcode_is_control and payloadlen >= 126 then -- control frames must have payload < 126 return false, "Control frame payload overload" end if frame_opcode_is_control and not final_frame then return false, "Control frame must not be fragmented" end local frame_length, err = read(self.id, nil, h_data) else --payloadlen == 127 local l_data, 8) if not l_data then return false, "Payloadlen 127 read true length error:" .. err end frame_length = string.pack("!L", err = read(self.id, nil, final_frame, frame_opcode, mask_frame, frame_length) local frame_data = "" if frame_length > 0 then local fdata, frame_length) if not fdata then return false, "Payload data read error:" .. err end frame_data = fdata end if mask_frame and frame_length > 0 then frame_data = websocket_mask(frame_mask, frame_length) end if not final_frame then return true, frame_data else if frame_opcode == 0x1 then -- text return true, frame_data elseif frame_opcode == 0x2 then -- binary return true, frame_data elseif frame_opcode == 0x8 then -- close local code, frame_data:sub(1, code, frame_data) end return true, nil end end function ws:start() while true do local message, message, err) socket.close(self.id) end end end return ws 是用方法也很简单,手机页面切图排版基于回调的方式用起来真是舒服

     2.还是喜欢tornado websocket的基于回调的方式div+css+js切图,当然我写的既可使用回调方式,网页重构报价也可使用lua-resty-websocket

    其实解析websocket还是比较简单的承接网站前端,比较复杂点的是websocket 的close操作.和握手一样,承接网站前端close也是需要客户端-服务器

    当服务端->close ->客户端psd切图html,此时客户端得到close事件web外包,客户端接着会主动发送close frame给服务端,div切图排版服务端接收到

local skynet = require "skynet" local socket = require "socket" local string = require "string" local websocket = require "websocket" local httpd = require "http.httpd" local urllib = require "http.url" local sockethelper = require "http.sockethelper" local handler = {} function handler.on_open(ws) print(string.format("%d::open", message) print(string.format("%d receive:%s", message)) ws:send_text(message .. "from server") end function handler.on_close(ws, reason) print(string.format("%d close:%d %s", code, url, header, 8192) if code then if url == "/ws" then local ws = websocket.new(id, handler) ws:start() end end end skynet.start(function() local address = "0.0.0.0:8001" skynet.error("Listening "..address) local id = assert(socket.listen(address)) socket.start(id , addr) socket.start(id) pcall(handle_socket, id) end) end) 详细信息请到 https://github.com/Skycrab/skynet_websocket

      最近做的都是一些h5小游戏,web外包用tornado/django基本上也都绰绰有余网页切图制作,skynet没有带websocket库div+css+js切图,于是就很happy的去造轮子去了,网页重构报价虽然有lua-resty-websocket这个nginx扩展库承接网站前端,有2个原因我不喜欢.

opcode为8的close事件,承接网站前端关闭客户端socket.

这里需要注意psd切图html,如果用js 的话,psd切图htmlvar ws = new WebSocket('XXXX'),底层会帮你调用.

点击次数:11825
作者:
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日A002-开发工具介绍 【系统运维】2015年08月05日android系统在静音模式下关闭camera拍照声音的方法2014年01月30日四、伪分布下安装hive 【Web前端】2015年07月31日【ObjectC】反射机制 【系统运维】2014年12月03日poj2408AnagramGroups(hash)【Web前端】2014年11月04日单链表环的问题【编程语言】2015年04月07日Hdu4280IslandTransport(最大流) 【数据库】2015年08月14日轻量网络游戏服务器框架?skynetv1.0.0rc5发布 ,,2016年07月24日心疼安卓之父!全面屏新机Essential因商标侵权被指控 ,,2017年06月08日Fresco(各种特效)——Loading效果 【编程语言】2015年04月17日金额转换——阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)【编程语言】2015年05月25日空三匹配和密集匹配的区别与联系 【综合】2015年03月13日Winform控件之分组类控件 【移动开发】2015年05月28日解析:android如何从JPEG生成BufferedImage2014年01月30日九度OJ1038Sumoffactorials(模拟) 【研发管理】2014年12月16日POJ1905-ExpandingRods【二分三分】【编程语言】2015年07月24日androidlistview长按,单击各种事件捕捉 【编程语言】2015年05月18日asp.net创建位图生成验证图片类(验证码类)2014年01月29日幸运摇摇看项目总结【编程语言】2014年11月26日Codevs1992题解 【综合】2015年07月13日codeforces--C-AnyaandGhosts(贪心)【Web前端】2015年01月29日一些项目——输入三个字符串,按由小到大的顺序输出 【编程语言】2015年01月12日leetcode-35-SearchInsertPosition 【编程语言】2015年06月24日PAT1003Sharing(25) 【云计算】2015年06月11日政府扶持良心教育企业,郑州传智播客学费再降1000元 【编程语言】2015年04月24日【LeetCode】DecodeWays 【移动开发】2014年11月18日剑指Offer面试题16(Java版):反转链表【互联网】2015年08月03日JS:clientWidth、scrollWidth、offsetWidth、clientTop、scrollTop、offsetTop、offsetParent 【Web前端】2015年05月15日12个创意云素材网站设计2014年01月28日将查询条件的input、select清空2014年01月29日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)