白话skynet第二篇:skynet的通讯调试pack和sprotol

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

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

根据示例,咱们能够知道。通讯的步骤以下。session

  1. 客户端按大小端打包成二进制。
  2. socket发送。
  3. 服务端接收。
  4. 服务端解包。
    逐个说说这其中的操做方法。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作一些改动才行。lua

相关文章
相关标签/搜索