以自定义的登录协议来作为网络接收,在根据事件号来回调处理登录消息。以此来说明下使用twisted的反应器和自定义的udp协议来具体处理应用。
1、登录服务器及其处理协议
登录服务器对象,处理登录协议请求。
class LoginServer:
PORT = 8888
_SESSION_BEGIN = 0x123456
_SESSION_END = 0x888888
def __init__(self, config):
self.config = config
self.port = config.port
self.user_sessions = {}
self.event_handlers = {
#事件回调处理登录事件,根据事件号来选择具体的回调函数
#网络的接收的处理在自定义的登录协议中完成(LoginServerProtocol(protocol.DatagramProtocol))
LOGIN_VERCHECK.REQ:self.handle_check_version_req,#检查版本
LOGIN_LOGIN.REQ:self.handle_login_req,#登录请求
LOGIN_LOGOUT.REQ:self.handle_logout_req,#登出请求
LOGIN_REGISTER.REQ:self.handle_register_req,#注册请求
SYSTEM_USER_AUTH.REQ:self.handle_user_auth_req,#检验账号请求
}
#创建会话
def create_session(self):
# 产生随机的session
return UserSession(random.randint(LoginServer._SESSION_BEGIN, \
LoginServer._SESSION_END))
#运行twisted反应器的监听端口,以及处理的协议
def run(self):
protocol = LoginServerProtocol(self)#使用自定义登录协议
reactor.listenUDP(self.port, protocol)#使用的网络协议udp短连接
reactor.run()#开始反应器运行处理协议
#协议遇到事件的回调
def on_client_event(self, protocol, host, port, client_event):
event_type = client_event.header.event_type
print u"receive a event from :", event_type, host, port
log.info(u"receive a event %d from %s:%d", event_type, host, port)
if event_type not in self.event_handlers:
log.error(u"The event type %d is not valid", event_type)
print u"The event type is not valid:", event_type
return
handler = self.event_handlers[event_type]
try :
handler(protocol, host, port, client_event)
except:
traceback.print_exc()
print u"Error Is Happend for event :", event_type
log.error(u"Error Is Happend for event %d", event_type)
#处理验证请求
def handle_user_auth_req(self, protocol, host, port, client_event):
req = UserAuthReq()
req.decode(client_event.data)
res = UserAuthRes()
res.user = req.user
res.session = req.session
log.info(u"UserAuth:%d,%d", req.user, req.session)
if self.is_valid_session(req.user, req.session):#检验用户会话的合法性
res.result = 0
else:
res.result = -1
#返回给客户端是否验证通过
self.response_to_client(protocol, host, port, client_event, \