小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用python來開發(fā)webgame服務(wù)端(3) @ CiNiao's blog

 londonKu 2012-11-01
  刺鳥原創(chuàng)文章,轉(zhuǎn)載請注明出處
    在之前的準(zhǔn)備工作中,我們已經(jīng)建立了一個socket服務(wù)器,并且經(jīng)過了簡單的測試,得到的結(jié)論是python可以滿足我們的需求,那么接下來,我們要解決的是身為webgame服務(wù)端必須的幾個功能模塊:

    一、記錄和維護(hù)所有客戶機的狀態(tài)
    更新:按照jinmin_lan同學(xué)的建議,這里直接用self.transport.sessionno即可,查twisted文檔的時候我忽略了這個東西。因此無需按照我下面的方法來手動維護(hù),好吧,我造了一次輪子……    

    為了實現(xiàn)這個功能,我們先回過頭來分析下之前的服務(wù)端代碼:
    1、每個客戶端連接會有一個gameSocket對象被創(chuàng)建,然后觸發(fā)connectionMade事件。
    2、客戶端數(shù)據(jù)到達(dá)的時候觸發(fā)dataReceived事件
    3、連接斷開的時候觸發(fā)connectionLost事件,然后對象被析構(gòu)

    根據(jù)通常的處理思路,我們需要為每個客戶端建立一個編號,即傳說中的sockid,然后維護(hù)一個client和sockid之間的雙向字典,以便我們能夠簡單的互相反查。我決定維護(hù)2份數(shù)據(jù),以空間換時間,新建一個sockMana類來實現(xiàn)該功能:
  1. # sockmana.py
  2. class SockMana:
  3.     def __init__ (self):
  4.         self.sockNum = 0 #記錄當(dāng)前的在線總數(shù)
  5.         self.sockIndex = 1 #累加sockid
  6.         self.client2id = {} #保存client->sockid字典
  7.         self.id2client = {} #保存sockid->client字典
  8.     def addClient(self,client):
  9.         #增加一個客戶端
  10.         print '** add client **'
  11.         self.sockNum = self.sockNum + 1
  12.         self.client2id[client] = self.sockIndex
  13.         self.id2client[self.sockIndex] = client
  14.         self.sockIndex = self.sockIndex + 1
  15.         print self.sockNum
  16.         print self.client2id
  17.         print self.id2client
  18.     
  19.     def delClient(self,client):
  20.         #刪除一個客戶端
  21.         print '** del client **'
  22.         if client in self.client2id:
  23.             self.sockNum = self.sockNum - 1
  24.             _sockid = self.client2id[client]
  25.             del self.client2id[client]
  26.             del self.id2client[_sockid]
  27.             print self.client2id
  28.             print self.id2client
  29.     
  30.     def getSockid(self,client):
  31.         #通過client獲取sockid
  32.         if client in self.client2id:
  33.             return self.client2id[client]
  34.         else:
  35.             return None
  36.         
  37.     def getClient(self,sockid):
  38.         #通過sockid獲取client
  39.         if sockid in self.id2client:
  40.             return self.id2client[sockid]
  41.         else:
  42.             return None    
  43. #初始化連接管理器
  44. sockMana = SockMana()

    接下來在我們的socket服務(wù)端代碼中import它,并增加調(diào)用事件,然后略修改dataReceived事件,當(dāng)收到客戶端數(shù)據(jù)的時候,我們向客戶端返回它的sockid,完整的服務(wù)端代碼調(diào)整為:

  1. import os
  2. if os.name!='nt':
  3.     from twisted.internet import epollreactor
  4.     epollreactor.install()    
  5. else:
  6.     from twisted.internet import iocpreactor
  7.     iocpreactor.install()
  8. from twisted.internet.protocol import Factory,Protocol
  9. from twisted.internet import reactor
  10. from sockmana import sockMana
  11. class gameSocket(Protocol):
  12.     #有新用戶連接至服務(wù)器
  13.     def connectionMade(self):
  14.         sockMana.addClient(self)
  15.         print 'New Client'
  16.     
  17.     #客戶端斷開連接
  18.     def connectionLost(self,reason):
  19.         sockMana.delClient(self)
  20.         print 'Lost Client'
  21.     
  22.     #收到客戶端發(fā)送數(shù)據(jù)
  23.     def dataReceived(self, data):
  24.         print 'Get data:' + str(data)
  25.         #向該客戶端發(fā)送數(shù)據(jù)
  26.         self.transport.write('your sockid is:'+ str(sockMana.getSockid(self)))
  27.     
  28. if __name__=='__main__':
  29.     f = Factory()
  30.     f.protocol = gameSocket
  31.     reactor.listenTCP(5200,f)
  32.     print 'server started...'
  33.     reactor.run()

    然后我們依然用telnet,來建立2個連接試試。
   

    可以看到,每增加一個客戶端,我們的sockMana類中就會分別增加2個 key->val的鍵值對,通過sockMana.getSockid方法即可獲取客戶端的sockid,這樣我們就為每個客戶端建立了一個唯一且可用于傳遞和儲存的數(shù)值編號,在以后的邏輯處理中,這將作為客戶端的唯一標(biāo)識。

    好了,我們斷開其中一個客戶端,看看我們的sockMana工作正常否?
    

    Yes!和預(yù)料中的一樣,一切工作正常。我們又向前邁進(jìn)了小小的一步,下面,我們得研究研究服務(wù)端如何和客戶端之間高效的傳輸數(shù)據(jù)了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多