1. 程式人生 > >為skynet移植一個lua-websocke庫

為skynet移植一個lua-websocke庫

為skynet移植一個lua-websocke庫

簡介

目前大部分遊戲、移動網際網路、H5客戶端主要由JavaScript、Lua、C#、C++等語言進行邏輯開發, 其主要通訊方案便是基於HTTP協議的介面請求與Websocket的推送方案.

起因

skynet內部實現了一套同步非阻塞socket庫, 並且提供了TCP通訊方案進行資料流分割. 所謂的TCP資料流分割. 就是根據一定方式讀取資料的一種流程.

最為常見的資料分割方案應該是: 2位元組頭部 + 資料載荷. 另一種通用方案是將頭部擴充套件為4位元組, 這樣在頭部資訊中可以包含協議版本或者訊息型別還可以進行平滑的進行協議升級擴充套件.

這些方案一般用於定製C/S網路協議. 絕大多數場景中並沒有必須使用到這個場景, 且維護一套這樣的協議也是需要佔用開發週期的.本人也使用過國內的開發者基於skynet編寫的websockket開發庫. 就使用上來說效果不是很理想, 且期間遇到的一系列問題也需要自己實際定製化後才能解決.

剛好近期由於正在為開發的Lua Web框架編寫Websocket使用教程, 那麼幹脆趁這個機會為skynet移植一套專用的websocket庫.

編寫完成後, 我將它隨意的命名為: skynet-lua-websocket.

開始移植工作

1. 握手流程

skynet要使用Websocket協議進行通訊需要實現HTTP/1.1版本中101響應方法. skyent.httpd

庫可以完成HTTP協議的解析工作, 但是我們並沒有使用到它.

究其原因是因為websocket實現互動並不複雜且所以無需依賴其它應用層協議庫的實現. HTTP本身就是一個基於文字的互動協議, 我們可以通過文字分割方案來完成它.

當連線到來時我們需要定義一個方法來處理握手協議互動(do_handshak). 在握手期間我們需要等待客戶端傳送有效的HTTP請求資料(協議、方法、版本、頭部等等).

在握手期間我們不能忘記給它加上一個超時限制(set_timeout), 這個限制需要然客戶端在指定時間範圍內完成握手. 否則, 只能斷開連線來節省伺服器資源開銷.

當HTTP請求資料接收完畢後, 我們需要對頭部資訊進行簡單的驗證. 這個驗證過程並不會很複雜, 因為我們只需要知道頭部資訊是否完整有效即可.

在驗證完成與通過的時候, 我們需要返回一個協議升級成功的101迴應來通知客戶端, 可以使用websocket規定的協議進行通訊並且開始監聽連結是否有資料即可.

2. 訊息互動

Websocket協議規範中定義了一些常用的訊息(控制幀). 目前為止, 我們也僅需要使用到這些訊息: textbinarypingpongclose.

text/binary可以分為一種客戶端請求訊息, 它定義了客戶端傳送到服務端的資料是什麼型別. 這通常在專案開發初期已經約定好傳輸協議, 所以無需過多考慮.

ping/pong通常是成對出現的; 它一般用作心跳檢查(雖然沒有人這樣做)與互動測試工作.

close一般主動推送關閉訊息, 一般情況下接收到這樣的訊息的處理方式為關閉連線.

3. 事件處理

事件處理方式就仿照JavaScript設計定義了4種回撥函式型別(on_openon_messageon_erroron_close), 這樣能簡化程式碼編寫難度.

在每個客戶端連線到來的時候為使用者初始化ctor方法併為其注入ws物件用於與客戶端進行通訊(sendclose). 當客戶端連線建立完成後會在應用層觸發open方法, 讓開發者此時做一些相關的初始化的操作.

期間與客戶端連線保持的期間內定義了on_message方法用於接收客戶端的資料, 對需要回應的資料可以使用self.ws:send方法進行訊息迴應.

最後, 我們可以在連線完成(斷開)的時候觸發on_close方法, 集中式資源回收更加簡單.

使用方法

可以通過這裡的描述學習如何使用它.

下載

專案地址在

相關推薦

skynet移植一個lua-websocke

為skynet移植一個lua-websocke庫 簡介 目前大部分遊戲、移動網際網路、H5客戶端主要由JavaScript、Lua

願你每一個使用類的人,思維能夠真正從使用函式轉換真正的面向物件

前言 java語言並不是純粹的面向物件,Java中有對基本資料型別的支援 java中基本資料型別分類:數值型別(整型+字元型+浮點型)+布林型別,所有數值型別之間可以進行自動轉換和強制型別轉換 j

一個modbus協議移植——libmodbus-master

modbus協議是工業上常用的資料傳輸協議,在linux系統上,大家一般自己編寫或者找別人的程式碼複用,程式碼質量無法保障,除錯起來也比較費勁,最近發現github上有個非常好的modbus協議類庫,經過測試發現很好用,支援串列埠和ip兩種方式,下面記錄下來往arm版移植(

skynet的crypt擴充套件一些加密(摘要)演算法支援

改造起因 在上篇文章, 我描述了為skynet新增穩定的websocket支援的起始並闡述了這麼做的原因. 這幾天在測試的時候發現

7.qfilesystemmodel rowcount 什麽0? 一個簡單的model類的例子

不顯示 tro display ica directory find .cpp this int 任務: 1.新建一個空的mainwindow項目 2.debug下編譯得到一個文件夾,應用程序輸出這個文件夾中的文件(不顯示文件夾中的文件夾) 3.使用QFileSystemM

三張圖教你生成一個Android jar

教程 water b2c 是把 eas mod div log 第三方 我看到非常多教人使用第三方開源組件的Android教程。都是在教基於源代碼project的庫導入,個人覺得非常不妥,覺得最恰當的方式是把源代碼project生成一個jar再導入到目標project上

TCP server 什麽一個端口可以建立多個連接?

tab 建立 傳輸 grep not ide 技術分享 什麽 circle https://segmentfault.com/q/1010000003101541 如果是tcp client用同一個本地端口去連不同的兩個服務器ip,連第二個時就會提示端口已被占用。但服務

實現一個javascript手勢 -- base-gesture.js

存在 之前 art tar 如果 給他 上下 避免 私家車   現在移動端這麽普及呢,我們在手機上可以操作更多了。對於網頁來說實現一些豐富的操作感覺也是非常有必要的,對吧(如果你僅僅需要click,,那就當我沒說咯。。。)~~比如實現上下,左右滑動,點擊之類的,加上這些東西

讓我你介紹一個神器:Chimee,一套可擴展的 H5 視頻播放器解決方案

包括 api 人員 保持 打包 需求 解耦 日常 開發 Chimee(讀“奇米”, [t??‘m?:])是由奇舞團開源的一套 H5 視頻播放器解決方案,由奇舞團視頻雲前端團隊結合在業務和視頻編解碼方向的沈澱積累傾心打造。 Chimee 支持 MP4、M3U8、FLV 等

cocos2d-x學習筆記(十二)cocos2dx 3.10添加lua LuaFileSystem遍歷文件

luafilesystem庫;lfs;遍歷文件在lua中遍歷目錄文件需要用到lfs庫,而所用的cocos2dx 3.10沒用lfs,需要自己添加1、下載lfs.c和lfs.hhttps://github.com/keplerproject/luafilesystem 從github獲取源碼,在src目錄拷貝l

skynet 報錯 skynet 服務缺陷 Lua死循環

sql 出了 roo nbsp 報錯 png 分享 解決 es2017 我的報錯如下: 看起來是skynet中lua死循環,實際上,可能只是本地配置出了問題,比如,我的數據庫連接不上了,因為我把別人的配置更新到我本地了,嗎,mysql秘密不對 解決辦法就是將配置文件中的

lua相關安裝常見問題

ash res 報錯 技術分享 lar .org 版本 成功 ould 一、先安裝lua brew install lua 我本機的安裝路徑為:/usr/local/Cellar/lua/5.3.4_2 二、安裝luarocks 下載luarocks的安裝包: http:/

Array和ArrayList的Clone什麽一個不用類型轉換,一個要類型轉換

分析 original 調用 super 不用 轉換 得出 ima 分享圖片 通過上面一段代碼可以看出Array的Clone()不用進行類型轉換,但ArrayList的Clone要進行類型轉換。為什麽會出現這種情況呢?我們來分析下源碼 現在來看下Array的Clone()

skynet 創建 lua 服務流程

table service send value don 如果 rto tco 獲取 本文以 skynet 示例 simpledb 為例,講述 skynet 創建 lua 服務的流程 首先 skynet 中使用 skynet.newservice 來創建 lua 服務 1

freeRTOS V10.0.1移植到STM32F407標準 - 環境Keil5

org 其中 需要 eno port ask sig ESS tick   最近因為工作需要用到FreeRTOS,其實開始本人內心是拒絕的因為自己只學習過UCOSIII還沒實際上過什麽大又復雜的工程,但是誰讓FreeRTOS他是Free的呢公司成本考慮肯定是不會選擇USOS

lua string

abcd 空格 reverse 數值 cal 忽略 個數 補齊 nbsp 相關的方法如下圖所示: len string.len(s) 返回字符串s的長度 string.len(‘abcd‘)    --> 4 rep string.rep(s,n) 返

怎樣企業挑選雲數據

用戶服 iaas 品牌 小鳥 設計者 可能 雲上 應該 建議 開發者和應用設計者對於在雲端部署數據庫有眾多選擇,很難做出最佳的選擇判斷。將數據庫服務器在IaaS雲上運行好嗎?或者應該轉換成PaaS選擇?數據庫即服務的選擇可能聽起來很誘人,但真正選擇起來卻不容易。目前市場上提

自己維護一個小倉庫

           很多開發人員在初期都沒有很好地注意整理自己的小倉庫,使得有一些做過的工作沒有產生應有的價值,當需要的時候又要另起爐灶,重新開發。這樣不僅浪費了自己的勞動成果,降低了工作效率,有時甚至再也找不到當時的靈感了,十分可惜。

Cookie 詳解以及實現一個 cookie 操作

Cookie 詳解以及實現一個 cookie 操作庫 cookie 在前端有著大量的應用,但有時我們對它還是一知半解。下面來看看它的一些具體的用法 Set-Cookie 伺服器通過設定響應頭來設定客戶端的 cookie,形如: Set-Cookie: <cookie名>=&

Lua ---- LFS的使用

lfs.attributes(filepath [, aname]) 獲取路徑指定屬性     lfs.chdir(path) 改變當前工作目錄,成功返回true,失敗返回nil加上錯誤資訊     lfs.