把工作幾年服務器相關的部分內容,通過服務器解決方案,做一次總結。
整個實現的主體是lua腳本,lua實現主要缺少的兩大塊:
1網絡部分
2數據庫部分
這兩部分必須通過c/c++做擴展
先來做net,主要是服務器net,和客戶端net。
服務器發起連接的情況主要是用於和平台驗證,上報之類的,還有服務間通信,接口如下:
_connect(ip, port, onconnect, onclose, timeout)
參數:
ip,地址
port 端口
onconnect 連接上的回調
onclose 關閉的回調
timeout 連接的客戶端socket超時時間,超時會回調close
返回net對象
服務器net負責監聽,收集客戶端來的消息,接口如下:
_listen(ip, port, onconnect, onclose, timeout)
參數:
ip,地址
port 端口
onconnect 連接上的回調
onclose 關閉的回調
timeout 連接的客戶端socket超時時間,超時會回調close
返回net對象
net對象方法:
net:receive(sep1,sep2,sep3,maxlen, onrec),設置接收條件
net:send(data)
net:close(),主動關閉連接
假定客戶端和服務器的通信協議是:4字節表示長度len,後面len個字節表示真正的消息
服務器net典型使用方法
locla function onbody(net, data)
--data 是消息包,根據需要處理
net:receive(4, onhead)
end
local funciton onhead(net, data)
local len=string.from32(data)
--len是消息包的字節長度
net:receive(len, onbody)
end
local function onconnect(net, snet)
net:receive(4, onhead)
end
local function onclose(net, msg)
print("net closed", msg)
end
local snet=_listen("0.0.0.0", 80, onconnect, onclose, 60)
假定服務器給客戶端發的消息包,協議如上
客戶端典型使用如下:
locla function onbody(net, data)
--data 是消息包,根據需要處理
net:receive(4, onhead)
end
local function onconnect(net, snet)
net:receive(4, onhead)
end
local function onclose(net, msg)
print("net closed", msg)
end
local cnet=_connect("X.X.X.X", 8081, onconnect, onclose, 60)
net:send(#data)
net:send(data)
網絡部分使用了libiop庫,因為它的一些api不滿足我的需求,稍作了修改,源碼等哪天有空(等系列文章寫完了再整理)整理下,測試通過了再上傳。
net和sql都是給lua做拓展,精彩部分在lua,稍後