Example #1
0
class MainServer(object):
    """docstring for MainServer"""
    def __init__(self, **kwargs):
        super(MainServer, self).__init__()

        self.port = 8888
        self.header = 8
        self.shutdown = False

        if 'port' in kwargs:
            self.port = kwargs['port']
        if 'header' in kwargs:
            self.header = kwargs['header']

        self._init_attr()

    #----------------------------------------------------------------------
    # 类属性设置
    #----------------------------------------------------------------------
    def _init_attr(self):
        self.host = ns.nethost(self.header)
        self.clients = {}
        self.db = SqliteDb()

        # 大厅服务代理
        self.roomservice = RoomService()
        self.roomservice.set_host(self.host)
        self.roomservice.set_clients(self.clients)
        self.roomservice.set_db(self.db)
        # 游戏流程服务代理

        self.gameservice = GameService()
        self.gameservice.set_host(self.host)
        self.gameservice.set_clients(self.clients)
        self.gameservice.set_db(self.db)
        #创建消息处理分发器
        self.dispatch = dispatcher()

        #向分发器注册两个窗口类
        self.dispatch.register(self.roomservice.SID, self.roomservice)
        self.dispatch.register(self.gameservice.SID, self.gameservice)

    def startup(self):
        self.host.startup(self.port)

    def send(self, hid, data):
        self.host.send(hid, data)

    #----------------------------------------------------------------------
    # 游戏流程处理
    #----------------------------------------------------------------------

    # 玩家申请游戏开始
    def require_game_start(self, hid, jdata):
        self.send(hid, json.dumps(jdata))

    #消息分发处理
    def patcher_data(self, hid, data):
        jdata = json.loads(data)
        tag = jdata['tag']

        jdata['hid'] = hid
        # 专属游戏界面端消息
        if tag in (dtag.MOVE, dtag.BACK_MOVE, dtag.BACK_MOVE_REPLY, dtag.PLAYER_CHAT, dtag.GAME_GIVE_UP, dtag.REQUIRE_USER_INFO):
            jdata['sid'] = self.gameservice.SID
            self.dispatch.dispatch(jdata, self.gameservice)

        # 专属大厅消息
        elif tag in (dtag.ROOM_LOGIN, dtag.GET_ROOM, dtag.PLAYERS_CHAT):
            jdata['sid'] = self.roomservice.SID
            self.dispatch.dispatch(jdata, self.roomservice)

        # 同时通知游戏界面和大厅更新消息
        elif tag in (dtag.ENTER_ROOM, dtag.GAME_LEAVE):
            jdata['sid'] = self.roomservice.SID
            self.dispatch.dispatch(jdata, self.roomservice)

            jdata['sid'] = self.gameservice.SID
            self.dispatch.dispatch(jdata, self.gameservice)

        elif tag == dtag.CLOSE_CLIENT:
            jdata['sid'] = self.roomservice.SID
            self.dispatch.dispatch(jdata, self.roomservice)

            jdata['sid'] = self.gameservice.SID
            self.dispatch.dispatch(jdata, self.gameservice)
            del self.clients[hid]

    # 新客户端接入
    def new_client(self, hid):
        self.clients[hid] = {}
        jdata = {}
        jdata['tag'] = dtag.NEW_CLIENT
        jdata['hid'] = hid
        self.host.send(hid, json.dumps(jdata))

    # 客户端失去连接
    def lose_connect(self, hid):
        # 如果失去连接,则默认对手赢
        opponent = self.clients.get(hid).get('opponent')
        if opponent:
            self.gameservice.win_notion(hid, False, True)
            self.gameservice.win_notion(opponent, True, True)

    #----------------------------------------------------------------------
    # 主消息分发函数
    #----------------------------------------------------------------------
    def process(self):
        while not self.shutdown:
            if self.host.state == 0:
                self.host.startup()
            time.sleep(0.1)
            self.host.process()
            event, wparam, lparam, data = self.host.read()
            if event < 0: continue
            if event == ns.NET_DATA:    #new data
                self.patcher_data(wparam, data)
            elif event == ns.NET_NEW:   #new client
                logger.debug('new client')
                self.new_client(wparam)
            elif event == ns.NET_LEAVE:
                logger.debug('connect lose')
                self.lose_connect(wparam)