文档章节

为skynet移植一个lua-websocke库

水果糖的小铺子
 水果糖的小铺子
发布于 2019/06/22 10:06
字数 1247
阅读 41
收藏 0

为skynet移植一个lua-websocke库

简介

目前大部分游戏、移动互联网、H5客户端主要由JavaScript、Lua、C#、C++等语言进行逻辑开发, 其主要通讯方案便是基于HTTP协议的接口请求与Websocket的推送方案.

起因

skynet内部实现了一套同步非阻塞socket库, 并且提供了TCP通讯方案进行数据流分割. 所谓的TCP数据流分割. 就是根据一定方式读取数据的一种流程.

最为常见的数据分割方案应该是: 2字节头部 + 数据载荷. 另一种通用方案是将头部扩展为4字节, 这样在头部信息中可以包含协议版本或者消息类型还可以进行平滑的进行协议升级扩展.

这些方案一般用于定制C/S网络协议. 绝大多数场景中并没有必须使用到这个场景, 且维护一套这样的协议也是需要占用开发周期的.本人也使用过国内的开发者基于skynet编写的websockket开发库. 就使用上来说效果不是很理想, 且期间遇到的一系列问题也需要自己实际定制化后才能解决.

刚好近期由于正在为开发的Lua Web框架编写Websocket使用教程, 那么干脆趁这个机会为skynet移植一套专用的websocket库.

编写完成后, 我将它随意的命名为: skynet-lua-websocket.

开始移植工作

1. 握手流程

skynet要使用Websocket协议进行通讯需要实现HTTP/1.1版本中101响应方法. skyent.httpd库可以完成HTTP协议的解析工作, 但是我们并没有使用到它.

究其原因是因为websocket实现交互并不复杂且所以无需依赖其它应用层协议库的实现. HTTP本身就是一个基于文本的交互协议, 我们可以通过文本分割方案来完成它.

当连接到来时我们需要定义一个方法来处理握手协议交互(do_handshak). 在握手期间我们需要等待客户端发送有效的HTTP请求数据(协议、方法、版本、头部等等).

在握手期间我们不能忘记给它加上一个超时限制(set_timeout), 这个限制需要然客户端在指定时间范围内完成握手. 否则, 只能断开连接来节省服务器资源开销.

当HTTP请求数据接收完毕后, 我们需要对头部信息进行简单的验证. 这个验证过程并不会很复杂, 因为我们只需要知道头部信息是否完整有效即可.

在验证完成与通过的时候, 我们需要返回一个协议升级成功的101回应来通知客户端, 可以使用websocket规定的协议进行通讯并且开始监听链接是否有数据即可.

2. 消息交互

Websocket协议规范中定义了一些常用的消息(控制帧). 目前为止, 我们也仅需要使用到这些消息: textbinarypingpongclose.

text/binary可以分为一种客户端请求消息, 它定义了客户端发送到服务端的数据是什么类型. 这通常在项目开发初期已经约定好传输协议, 所以无需过多考虑.

ping/pong通常是成对出现的; 它一般用作心跳检查(虽然没有人这样做)与交互测试工作.

close一般主动推送关闭消息, 一般情况下接收到这样的消息的处理方式为关闭连接.

3. 事件处理

事件处理方式就仿照JavaScript设计定义了4种回调函数类型(on_openon_messageon_erroron_close), 这样能简化代码编写难度.

在每个客户端连接到来的时候为用户初始化ctor方法并为其注入ws对象用于与客户端进行通讯(sendclose). 当客户端连接建立完成后会在应用层触发open方法, 让开发者此时做一些相关的初始化的操作.

期间与客户端连接保持的期间内定义了on_message方法用于接收客户端的数据, 对需要回应的数据可以使用self.ws:send方法进行消息回应.

最后, 我们可以在连接完成(断开)的时候触发on_close方法, 集中式资源回收更加简单.

使用方法

可以通过这里的描述学习如何使用它.

下载

项目地址在这里.

© 著作权归作者所有

水果糖的小铺子

水果糖的小铺子

粉丝 24
博文 153
码字总数 73315
作品 1
广州
程序员
私信 提问
为skynet的crypt库扩展一些加密(摘要)算法支持

改造起因 在上篇文章, 我描述了为添加稳定的支持的起始并阐述了这么做的原因. 这几天在测试的时候发现, 当使用内置的httpc库的时候会遇见缺少一些我需要用到的算法(例如: 、、等等). 这里完全...

水果糖的小铺子
2019/07/03
23
0
skynet 入门笔记(1):Hello, skynet!

Hello, Skynet! Skynet这名字让我想起了经典科幻电影《终结者》里毁灭人类世界的终极人工智障,skynet的官方文档是挺给力的,但是没有那么好的引导机制,看了半天的文档还是不知道该怎么用s...

uniqptr
2018/06/27
328
0
开源并发框架 Skynet 发布第一个正式版 v0.1.0

距离 skynet 开源项目的公布 已经有 20 月+ 了,如果从闭源阶段算起,已经超过了 30 个月。在我们公司内部有五个项目使用 skynet 开发,据有限的了解,在我们公司之外,至少有两个正式项目使...

C_Z
2014/04/23
4.1K
6
游戏服务器架构调研报告

服务器架构调研报告 刘源霖20151119 1. 前言 本文档主要是调研分析新的手游服务端架构,为下一款手游服务端研发提供可参考的方案。主要的参考点是数据持久化,并发效率,分布式,沙盒机制,热...

shezjl
2016/01/22
2.5K
1
开源并发框架 - Skynet

Skynet 是一个基于 Actor 模式的开源并发框架。 skynet 节点,通过 master ,认识网络中所有其它 skynet 节点。它们相互一一建立单向通讯通道。也就是说,如果一共有 100 个 skynet 节点,在...

匿名
2013/08/07
12.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

How to find table in a database with HeidiSQL

In this article I want to show you how you can find table by name with HeidiSQL. Find table by typing One of the options to find table is to having focus in the object explorer ......

Ciet
12分钟前
4
0
基于SWIG跨平台开发的C++编码规范

1、数组定义 使用数组不建议采用指针方式eg double *,或者 double test[4] 直接采用std::vector或list即可。对于固定长度的数组定义为一个结构体 double test[4]instead ofstruct Vec...

洋碱
14分钟前
2
0
用Markdown编程之布局

基本就是用Markdown的布局方式。 \:是转义符号,最高优先级。 行首+# :用于空间布局,1-6分别标明:模式根、子模式、子模式内。 行首+> :用于标注和通信,1个标明标注,2个标明分类,3个标...

dwcz
21分钟前
3
0
SpringBoot定时器多线程解决方案

@Scheduled 作用:spring定时器(定时执行一次或定时轮询执行一段代码) 使用场景:注解在方法上 参数说明:常用参数 @Scheduled 参数说明 String cron:cron表达式定义了方法执行的时间规则(网...

whoisliang
21分钟前
4
0
3.01、Spring AOP的理解

注:转 https://mp.weixin.qq.com/s/PsgTLn8cdTxdd542XgVkUA 什么是AOP AOP(Aspect-Oriented Programming), 即 面向切面编程 , 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相......

追忆2025
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部