游戏服务器之python短连接服务器(登录服务器)

以自定义的登录协议来作为网络接收,在根据事件号来回调处理登录消息。以此来说明下使用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, \
       
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值