今天来说说Skynet客户端和服务端网络通信的基础部分。

Skynet当前版本。lua是skynet自带的5.3版本。

根据示例,我们可以知道。通信的步骤如下。

  1. 客户端按大小端打包成二进制。
  2. socket发送。
  3. 服务端接收。
  4. 服务端解包。
    逐个说说这其中的操作方法。

    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的更多相关文章

  1. [转载] Fiddler为所欲为第二篇 像OD一样调试 [二]

    首先,如果大家没有看过第一篇,可以先看看第一篇,了解Fiddler script的脚本哦.传送门:https://www.52pojie.cn/thread-854434-1-1.html 导语:其实 ...

  2. WebApi学习总结系列第二篇(webapi的调试)

    目前使用webapi的调试主要有 1.用接口宿主调试.(宿主形式多样:web.winform.还有就是直接用app进行接口调试) 2.用Fiddler抓Http信息,进行调试. 1.用接口宿主调试. ...

  3. 白话skynet第一篇

    当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质, ...

  4. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  5. 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

    第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...

  6. 第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

  7. chromium浏览器开发系列第二篇:如何编译最新chromium源码

    说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1. ...

  8. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  9. JDFS:一款分布式文件管理实用程序第二篇(更新升级、解决一些bug)

    一 前言 本文是<JDFS:一款分布式文件管理实用程序>系列博客的第二篇,在上一篇博客中,笔者向读者展示了JDFS的核心功能部分,包括:服务端与客户端部分的上传.下载功能的实现,epoll ...

随机推荐

  1. spark MLlib BasicStatistics 统计学基础

    一, jar依赖,jsc创建. package ML.BasicStatistics; import com.google.common.collect.Lists; import org.apach ...

  2. 20175312 2018-2019-2 《Java程序设计》结对编程练习_四则运算(第二周:整体性总结)

    20175312 2018-2019-2 <Java程序设计>结对编程练习_四则运算(第二周:整体性总结) 结对对象与其博客链接 20175309 刘雨恒:https://www.cnbl ...

  3. 获取验证码倒计时60s

    倒计时函数: function time(btns) { if (wait == 0) { btns.css("background-color","#F84C02&qu ...

  4. SpringCloud教程 | 第四篇:断路器(Hystrix)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  5. java @Override 报错解决

    有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...

  6. XV Open Cup named after E.V. Pankratiev. GP of America

    A. Area of Effect 首先最优解中必有一个点在圆的边界上. 若半径就是$R$,则枚举一个点,然后把剩下的事件极角扫描即可,时间复杂度$O(m(n+m)\log(n+m))$. 否则圆必然 ...

  7. Chrome_查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. <!DOCTYPE html> <html lang=" ...

  8. React(三)JSX内置表达式

    (一)JSX是什么? React 使用 JSX 来替代常规的 JavaScript. JSX 是一个看起来很像 XML 的 JavaScript 语法扩展. 我们不需要一定使用 JSX,但它有以下优点 ...

  9. CentOS7 安装 jexus-5.8.2-x64

    前要提示: 如果你要安装asp.net 请参考: http://www.cnblogs.com/xiaoruilin/p/7867823.html 背景: CentOS7 Mono (Mono JIT ...

  10. 删除U8中单据已经审核完成但工作流未完成的任务

    问题描述: U8工作流终审结点后面还有节点时,当终审终点完成后,系统会通知后面的节点进行审核,但单据显示已经审核完成,后面的节点无法审核,工作任务会一直挂着,无法删除. 例如下图中,节点"终 ...