用python來開發webgame服務端(3)
來源:互聯網
上載者:User
刺鳥原創文章,轉載請註明出處
在之前的準備工作中,我們已經 建立了一個socket伺服器 ,並且經過了 簡單的測試 ,得到的結論是python可以滿足我們的需求,那麼接下來,我們要解決的是身為webgame服務端必須的幾個功能模組:
一、記錄和維護所有客戶機的狀態
更新:按照jinmin_lan同學的建議,這裡直接用self.transport.sessionno即可,查twisted文檔的時候我忽略了這個東西。因此無需按照我下面的方法來手動維護,好吧,我造了一次輪子……
為了實現這個功能,我們先回過頭來分析下之前的服務端代碼:
1、每個用戶端串連會有一個gameSocket對象被建立,然後觸發connectionMade事件。
2、用戶端資料到達的時候觸發dataReceived事件
3、串連斷開的時候觸發connectionLost事件,然後對象被析構
根據通常的處理思路,我們需要為每個用戶端建立一個編號,即傳說中的sockid,然後維護一個client和sockid之間的雙向字典,以便我們能夠簡單的互相反查。我決定維護2份資料,以空間換時間,建立一個sockMana類來實現該功能:
# sockmana.py class SockMana: def __init__ (self): self.sockNum = 0 #記錄當前的線上總數 self.sockIndex = 1 #累加sockid self.client2id = {} #儲存client->sockid字典 self.id2client = {} #儲存sockid->client字典 def addClient(self,client): #增加一個用戶端 print '** add client **' self.sockNum = self.sockNum + 1 self.client2id[client] = self.sockIndex self.id2client[self.sockIndex] = client self.sockIndex = self.sockIndex + 1 print self.sockNum print self.client2id print self.id2client def delClient(self,client): #刪除一個用戶端 print '** del client **' if client in self.client2id: self.sockNum = self.sockNum - 1 _sockid = self.client2id[client] del self.client2id[client] del self.id2client[_sockid] print self.client2id print self.id2client def getSockid(self,client): #通過client擷取sockid if client in self.client2id: return self.client2id[client] else: return None def getClient(self,sockid): #通過sockid擷取client if sockid in self.id2client: return self.id2client[sockid] else: return None #初始化連線管理員 sockMana = SockMana()
接下來在我們的socket服務端代碼中import它,並增加呼叫事件,然後略修改dataReceived事件,當收到用戶端資料的時候,我們向用戶端返回它的sockid,完整的服務端代碼調整為: