今天来说说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. JSONP ---------跨域

    什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...

  2. Python学习(四十)—— Djago之认证系统

    一.COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cook ...

  3. Fibonacci数列(数列 取模)

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  4. 网络编程-Mysql-2、各种查询

    1.先创建一个学生表 create table students ( id int auto_increment not null primary key, name varchar(20)  not ...

  5. SAS 对数据的拼接与串接

    SAS 对数据的拼接与串接 使用SAS对数据进行串接.合并.更新与修改. 1. 数据集的纵向串接 数据集的纵向串接指的是,将两个或者多个数据集首尾相连,形成 一个新的数据集. 对数据集的纵向串接可以通 ...

  6. Kali Linux常用服务配置教程安装及配置DHCP服务

    Kali Linux常用服务配置教程安装及配置DHCP服务 在Kali Linux中,默认没有安装DHCP服务.下面将介绍安装并配置DHCP服务的方法. 1.安装DHCP服务 在Kali Linux中 ...

  7. jade的写法

    标签直接写:p或p. 例如: p 今天自己很棒 p.今天自己很棒 则输入 <p>今天自己很棒</p> <p>今天自己很棒</p> ***jage模板记得 ...

  8. Java虚拟机----垃圾回收与内存分配

    一.垃圾回收的对象: 在Java的运行时数据区中,程序计数器和虚拟机栈.本地方法栈是随着线程的生灭而生灭,栈当中栈帧的大小在编译的时候已知,在方法结束之后栈帧出栈,这部分的垃圾回收是明确的,因此需要讨 ...

  9. Codechef August Challenge 2018 : Lonely Cycles

    传送门 几波树形dp就行了. #include<cstdio> #include<cstring> #include<algorithm> #define MN 5 ...

  10. HCNA-链路聚合(手工模式)

    设置链路聚合1 模式设置为手动 进入端口设置链路聚合号 进入另一个端口设置链路聚合号 使用dis cur 查看到相应的端口已经设置为聚合状态 1.使用相同的方法进入端口 设置聚合 2.使用dis显示聚 ...