白话skynet第二篇:skynet的通信调试pack和sprotol
今天来说说Skynet客户端和服务端网络通信的基础部分。
Skynet当前版本。lua是skynet自带的5.3版本。
根据示例,我们可以知道。通信的步骤如下。
- 客户端按大小端打包成二进制。
- socket发送。
- 服务端接收。
服务端解包。
逐个说说这其中的操作方法。1.第一步
local result = string.pack(">s2","string2pack")
pack > 表示按大端顺序。s2 表示按照2个字节打包。我们知道string由char组成。1个char 是 0-255 之间的数,2^8 ,1char=8byte. 1byte=1位0/1.
需要注意的是,他除了被打包的部分之外,还会在前面加2个字节,表示长度。
如果要打包一个数字则需要转换。由2种办法
string.pack("I2",number),会在前面二进制加2位表示长度的东西。
2.第二步
socket.send
3.服务端接收
gateserver已经有接收的代码了。
注意的是,socket会自动按pack的数据分段接收。也就是会根据pack的前面2位得到size。根据size去接收后面的数据。然后向上传递一份message。
接收到的message已经是去掉了前面2位的数据。
4.客户端接收
客户端接收到的数据目前我是用skynet提供的“client.socket”.没有netpack可用。
接收到的数据需要自行去除前面的2个字节的数据(string.pack产生的)。
这样算是完成了基础版本的通信。以上的实验可以通过在服务端和客户端最终发出和最初的接收的地方加校验码做测试。【参考这2个链接打印二进制】
但是这样是不够的。我们还需要找一套协议,比如sprotol。本来说sprotol就够了。但是一般来说,各种通信协议,都是分为控制校验和数据层两块。
比如示例中就加多了一个数据大小和session的设计。sprotol不用说简单易用,区分好客户端和服务端加载的顺序即可。
至于控制层依据个人习惯,一般来说,开头的地方拼接二进制就行。session还是有点用的,如果同一个客户端对同一个session多次发送
,可以在session级别做缓冲,减轻服务器压力,具体代码可以参见示例。也可以加标志位,作为是否加密等等。校验码,用来在gate层过滤垃圾消息。
但是其实这些都可以做到sprotol中去,作为一个公共的字段,但是没见sprotol支持这种写法。可以上述方法或者直接在sprotol中加字段实现。
但是在sprotol中加字段,将暴露给上层应用,不太符合网络协议设计的分层控制的思想,总之需要对sprotol做一些改动才行。
白话skynet第二篇:skynet的通信调试pack和sprotol的更多相关文章
- [转载] Fiddler为所欲为第二篇 像OD一样调试 [二]
首先,如果大家没有看过第一篇,可以先看看第一篇,了解Fiddler script的脚本哦.传送门:https://www.52pojie.cn/thread-854434-1-1.html 导语:其实 ...
- WebApi学习总结系列第二篇(webapi的调试)
目前使用webapi的调试主要有 1.用接口宿主调试.(宿主形式多样:web.winform.还有就是直接用app进行接口调试) 2.用Fiddler抓Http信息,进行调试. 1.用接口宿主调试. ...
- 白话skynet第一篇
当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质, ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- 第二篇 Integration Services:SSIS数据泵
本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...
- chromium浏览器开发系列第二篇:如何编译最新chromium源码
说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1. ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- JDFS:一款分布式文件管理实用程序第二篇(更新升级、解决一些bug)
一 前言 本文是<JDFS:一款分布式文件管理实用程序>系列博客的第二篇,在上一篇博客中,笔者向读者展示了JDFS的核心功能部分,包括:服务端与客户端部分的上传.下载功能的实现,epoll ...
随机推荐
- Redis .NET操作
Redis是一个支持数据结构更多的键值对数据库.它的值不仅可以是字符串等基本数据类型,也可以是类对象,更可以是Set.List.计数器等高级的数据结构. Memcached也可以保存类似于Set.Li ...
- Intellij Idea 2016创建web项目
一.创建简单web项目 1.创建一个web project File -> new Project ->选择project sdk 为1.8(已经配过环境变量)其他不要选 -> Ne ...
- org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse
跑sparkPis示例程序 [root@node01 bin]# ./spark-submit --master spark://node01:7077 --class org.apache.spar ...
- spring boot slf4j日记记录配置详解
https://blog.csdn.net/liuweixiao520/article/details/78900779
- Mysql 学习笔记02
14 mysql 的常见函数 数学函数 1 abs() 函数 ,返回绝对值 2 bin() 函数 ,返回数值的二进制数值 3 hex()函数 ,返回数值的十六进制的值 4 floor()函数 ,对小 ...
- MyBatis3系列__01HelloWorld
# MyBatis作为一个ORM框架,其重要程度不用过多介绍.下面开始一起学习吧:本博客的编程方法与MyBatis官方文档基本一致:## 1.创建一个数据库mybatis_learn以及对应的表tbl ...
- HBuilder 的使用
创建一个nui项目 打开index.html才能运行 查看夜神模拟器 创建App标题:mhe :在body中输入mhe让后回车,如果右侧不显示,Ctrl+s保存一下 创建标题:mhe 创建九宫格:mb ...
- centos7.4安装npm
下载网址 https://nodejs.org/dist/latest-v8.x/ 安装过程参考 https://blog.csdn.net/micarlxm/article/details/8109 ...
- springboot 启动排除某些bean 的注入
问题: 最近做项目的时候,需要引入其他的jar.然后还需要扫描这些jar里的某些bean.于是使用注解:@ComponentScan这个注解直接指定包名就可以,它会去扫描这个包下所有的class,然后 ...
- 报错!!!Servlet.service() for servlet [action] in context with path [/myssh] threw exception [java.lang.NullPointerException] with root cause java.lang.NullPointerException
这个为什么报错啊~~ at com.hsp.basic.BasicService.executeQuery(BasicService.java:33) 这个对应的语句是 Query query = ...