使用luasocket對接后端

簡單的說就是:

1.先連接登錄服務(wù)器進行驗證

2.登錄驗證成功后連接游戲服務(wù)器,后面就是游戲包的流程了

先說luasocket的連接

-- 設(shè)置ipv6

local isipv6_only = false

local addrinfo, err = socket.dns.getaddrinfo(self.host)

for i,v in ipairs(addrinfo) do

? ? ?if v.family == "inet6" then

? ? ? ? isipv6_only = true;

? ? ? ?break

? ?end

end

if isipv6_only then

? ?self.tcp = socket.tcp6()

else

? self.tcp = socket.tcp()

end

self.tcp:settimeout(0) ??

創(chuàng)建tcp

function SocketTCP:_connect()

? ? ?local __succ, __status = self.tcp:connect(self.host, self.port)

? ? ?return __succ == 1 or __status == STATUS_ALREADY_CONNECTED

end

然后是連接ip和端口,status返回status_already_connected表示連接成功,_connetct放在tick里面檢測是否連接成功,設(shè)定連接時間,到時間返回錯誤

local __tick = function()

? ?while true do

? ? ? ?local __body, __status, __partial = self.tcp:receive("*a") -- read the package body

? ? ? if __status == STATUS_CLOSED or __status == STATUS_NOT_CONNECTED then

? ? ? ? ? self:close()

? ? ? ? ?if self.isConnected then

? ? ? ? ? ? ?self:_onDisconnect()?

? ? ? ? ?else

? ? ? ? ? ?self:_connectFailure()

? ? ? ? ?end

? ? ? ? return

? ? end

? ? if (__body and string.len(__body) == 0) or (__partial and string.len(__partial) == 0) then ? ? ? ? return end

? ? ? if __body and __partial then

? ? ? ? ? ?__body = __body .. __partial?

? ? ? end

? ? ? ? ? ? ? self:dispatchEvent({name=SocketTCP.EVENT_DATA, data=(__partial or __body), ? ? partial=__partial, body=__body})

end

end

連接成功后就是用tcp:receive("*a")讀取接收數(shù)據(jù)處理,同樣是在tick里直到連接失敗

前面提到過連接登錄服務(wù)器和游戲服務(wù)器都是要通以上sockettcp來連接


現(xiàn)在說下登錄服務(wù)器驗證, 以skynet為例,調(diào)用connect連接成功后收到服務(wù)器數(shù)據(jù)進行認(rèn)證,如下

self._dispatch = function(self, msg)

local state = self.__state

if state == 1 then

S_EXCHANGE_KEY(msg)

self.__state = 2

elseif state == 2 then

S_SCERET(msg)

self.__state = 10

elseif state == 10 then --檢測版本

S_CHECK_VERSION(msg)

self.__state = 3

elseif state == 3 then

if not S_AUTH_BEGIN(msg) then

self.__state = 6

end

self.__state = 4

elseif state == 4 then

if not S_AUTH(msg) then

self.__state = 6

return

end

self.__state = 5?

closefd(self)

--設(shè)置新的處理函數(shù)

self.connect = connect_gameserver

self.reconnect = reconnect_gameserver

self.request = request_gameserver

self.close = closefd

return cb(self)

end

end

在state=5的時候已經(jīng)驗證成功,關(guān)閉與登錄服務(wù)器的連接,開始與游戲服務(wù)器連接,連接返回成功后前端立即發(fā)送secret(驗證時獲取)給游戲服務(wù)器進行驗證,驗證成功后進入游戲正常發(fā)包流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評論 19 139
  • 生命正是因為他的不可恒久性,才顯得彌足珍貴。在我們感嘆這滄海桑田的變幻時,只感流光如駒,悲乎!樂乎!孰不知這厚重的...
    素心伊人閱讀 164評論 0 0
  • 懂我的人, 不需要解釋。 不懂我的人, 沒必要解釋。 喜歡也好,討厭也好。 好像對我來說,都無所謂吧。 別裝著一副...
    玫瑰花的夢閱讀 234評論 0 1
  • 細(xì)細(xì)密密的雨如煙霧,聽不到雨落的聲音,只看到一朵朵傘花涌進校園。剛近教室,馬老師就笑著對我說:孩子們早就盼著你來了...
    chunma閱讀 502評論 0 2
  • 今天早上比較忙,領(lǐng)導(dǎo)都在家開會,所以今天早上沒有出來寫作業(yè),感覺非常的遺憾。今天一定要好好的補一補這個作業(yè),現(xiàn)在就...
    劉慢慢_9744閱讀 226評論 0 0

友情鏈接更多精彩內(nèi)容