白話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

相關文章
相關標籤/搜索