簡單的說就是:
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ù)進行認證况褪,如下
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ā)包流程