转:: 刺鸟:用python来开发webgame服务端(3)
来源:http://ciniao.me/article.php?id=11
---------------
刺鸟原创文章,转载请注明出处
在之前的准备工作中,我们已经建立了一个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,完整的服务端代码调整为:
import os
if os.name!='nt':
from twisted.internet import epollreactor
epollreactor.install()
else:
from twisted.internet import iocpreactor
iocpreactor.install()
from twisted.internet.protocol import Factory,Protocol
from twisted.internet import reactor
from sockmana import sockMana class gameSocket(Protocol):
#有新用户连接至服务器
def connectionMade(self):
sockMana.addClient(self)
print 'New Client' #客户端断开连接
def connectionLost(self,reason):
sockMana.delClient(self)
print 'Lost Client' #收到客户端发送数据
def dataReceived(self, data):
print 'Get data:' + str(data)
#向该客户端发送数据
self.transport.write('your sockid is:'+ str(sockMana.getSockid(self))) if __name__=='__main__':
f = Factory()
f.protocol = gameSocket
reactor.listenTCP(5200,f)
print 'server started...'
reactor.run()
然后我们依然用telnet,来建立2个连接试试。

可以看到,每增加一个客户端,我们的sockMana类中就会分别增加2个 key->val的键值对,通过sockMana.getSockid方法即可获取客户端的sockid,这样我们就为每个客户端建立了一个唯一且可用于传递和储存的数值编号,在以后的逻辑处理中,这将作为客户端的唯一标识。
好了,我们断开其中一个客户端,看看我们的sockMana工作正常否?

Yes!和预料中的一样,一切工作正常。我们又向前迈进了小小的一步,下面,我们得研究研究服务端如何和客户端之间高效的传输数据了。
#本文由刺鸟原创,欢迎转载,但请保留出处,也欢迎对本文感兴趣的同学多多交流。#
-----
转:: 刺鸟:用python来开发webgame服务端(3)的更多相关文章
- 转:: 刺鸟:用python来开发webgame服务端(2)
来源:http://ciniao.me/article.php?id=10 --------------- 刺鸟原创文章,转载请注明出处 就在刚才,我们用基于python下的Twisted库写了 ...
- 转:: 刺鸟:用python来开发webgame服务端(1)
来源:http://ciniao.me/article.php?id=9 --------------- 刺鸟原创文章,转载请注明出处 在开始之前,先简单描述一下项目的特点:我要实现的是一个mm ...
- 转:: 刺鸟:用python来开发webgame服务端(5)
来源:http://ciniao.me/article.php?id=19 --------------- 刺鸟原创文章,转载请注明出处 在前面的文章中,我们已经开始了不少逻辑功能的开发,在这期 ...
- 转:: 刺鸟:用python来开发webgame服务端(4)
来源:http://ciniao.me/article.php?id=14 --------------- 刺鸟原创文章,转载请注明出处 前面的工作都已准备就绪,现在我们得来看看服务端怎么和客户 ...
- Delphi XE5通过WebService开发Web服务端和手机客户端
Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices stand-alone vcl applicati ...
- 项目二:企业级java电商网站开发(服务端)
声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...
- 开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)
ice作为一种rpc框架,为主流平台设计,包括Windows和Linux,支持广泛的语言,包括C++,Java,C#(和其他.Net的语言,例如Visual Basic),Python,Ruby,PH ...
- cocos2d-x开发:服务端基础库封装
元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...
- iOS推送小结(证书的生成、客户端的开发、服务端的开发)
1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...
随机推荐
- 【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录
前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何自动运行,不让用户干涉,设置起始界面
右击视图管理器,添加一个TargetVisualization 在起始视图中点击右边的按钮,然后选择一个HMI作为起始HMI 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: h ...
- diskpart分盘代码
List Disk Select Disk 0 Clean Create Partition Primary Size=512000 Active Format Quick Create Partit ...
- 【FAQ】Ubuntu环境下ant编译android代码问题
在Ubuntu14.04环境下,编译android程序时候,运行ant debug的时候出现如下异常:
- Oracle数据类型,函数与存储过程
字符串类型 固定长度:char nchar n 表示Unicode编码 可变长度: varchar2 nvarchar2 数字类型:number(P,S)P:整数位数,S小数位数 ...
- How to learn a new technology
是什么?为什么会出现? 这一阶段主要是对该技术有一个整体了解,他所解决的是什么问题,他的整体结构等. 怎么做? 最简单的是找一个上手视频,因为视频是非常直观的展示了技术的使用.先学会用是最根本的,对于 ...
- 9、Linux驱动的杂项设备
杂项设备,是字符设备中的特殊,它的主设备号,是 10,不同的杂项设备,通过次设备号进行区分. 1.注册与注销 int misc_register(struct miscdevice * misc) 完 ...
- Idea maven多模块项目有些加载不出来
进入View>Tool Windows>Maven projects区域,添加新的项目识别. 选择要加载项目的pom.xml文件,ok 完成.
- 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
1.新建MasterFilterAttribute类继承ActionFilterAttribute,重写方法OnActionExecuted ,指定ViewResult的MasterName = &q ...
- Linux Tools
WinSCP http://winscp.net/eng/download.php Xshell 5