• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            python在tornado下websocket客戶端

            from tornado import httpclient
            from tornado import ioloop
            from tornado import websocket
            import uuid
            import binascii
            import struct
            import weakref
            DEFAULT_CONNECT_TIMEOUT = 60
            DEFAULT_REQUEST_TIMEOUT = 60
            def my_unpack(message1, length,ag_client):
                """解包"""
                message = message1[length:len(message1)]
                # 獲取cmd
                cmd, = struct.unpack('!i', message[0:4])
                # 獲取長度
                size, = struct.unpack('!i', message[4:8])
                if size!=len(message):
                    print('接收字節長度=%d' % (len(message)))
                    print('包頭中包長度=%d' % size)
                    print('cmd=====%d'%cmd)
                #包頭中的長度比包長度大,丟棄,不完整包
                if size >len(message):
                    print('壞包丟棄')
                    return
                # 包內容
                string, = struct.unpack('!{0}s'.format(size - 4), message[4:size])
                from protocol.deserialize import ag_parse
                ag_parse(cmd, string, ag_client)
                length += size
                if len(message) > size:
                    my_unpack(message1, length,ag_client)
            class WebSocketClient(object):
                """Base for web socket clients.
                """
                def __init__(self, *, connect_timeout = DEFAULT_CONNECT_TIMEOUT,
                                      request_timeout = DEFAULT_REQUEST_TIMEOUT,
                                      name = login_name,
                                      passwd = login_password,
                                      player = None):
                    self.connect_timeout = connect_timeout
                    self.request_timeout = request_timeout
                    #玩家登陸名
                    self.player_name = name
                    #玩家登陸passwd
                    self.player_passwd = passwd
                    #玩家數據
                    if player:
                        self.player = weakref.proxy(player)
                    else:
                        self.player = None
                def connect(self, url):
                    """Connect to the server.
                    :param str url: server URL.
                    """
                    request = httpclient.HTTPRequest(url=url,
                                                     connect_timeout=self.connect_timeout,
                                                     request_timeout=self.request_timeout)
                    ws_conn = websocket.WebSocketClientConnection(request,ioloop.IOLoop.current())
                    ws_conn.connect_future.add_done_callback(self._connect_callback)
                    ws_conn.on_message=self._on_message
                    ws_conn.on_connection_close=self._on_connection_close
                def send(self, data):
                    """Send message to the server
                    :param str data: message.
                    """
                    if not self._ws_connection:
                        raise RuntimeError('Web socket connection is closed.')
                    self._ws_connection.write_message(data,True)
                def close(self):
                    """Close connection.
                    """
                    if not self._ws_connection:
                        raise RuntimeError('Web socket connection is already closed.')
                    self._ws_connection.close()
                def _connect_callback(self, future):
                    if future.exception() is None:
                        self._ws_connection = future.result()
                        self._on_connection_success()
                    else:
                        self._on_connection_error(future.exception())
                def _on_message(self, msg):
                    """This is called when new message is available from the server.
                    :param str msg: server message.
                    """
                    pass
                def _on_connection_success(self):
                    """This is called on successful connection ot the server.
                    """
                    pass
                def _on_connection_close(self):
                    """This is called when server closed the connection.
                    """
                    pass
                def _on_connection_error(self, exception):
                    """This is called in case if connection to the server could
                    not established.
                    """
                    pass
                def bind(self,player):
                    pass
            class AppWebSocketClient(WebSocketClient):
                def _on_message(self, msg):
                    my_unpack(msg, 0, self)
                def _on_connection_success(self):
                    print('Connected!')
                    self.bind(self.player)
                    def intToBytes(value, length):
                        resu = []
                        for i in range(0, length):
                            resu.append(value >> (i * 8) & 0xff)
                        resu.reverse()
                        return resu
                    login_pack = packet_pb2.PK_CLIENT_LOGIN()
                    #用戶名
                     login_pack.loginname = self.player_name
                 
                    #密碼
                    curr_password = self.player_passwd
                    login_pack.devicetype = 1
                    result = []
                    temp = b''
                    for i in range(0, len(curr_password), 2):
                        result.append(binascii.unhexlify(curr_password[i:i + 2]))
                        temp += (binascii.unhexlify(curr_password[i:i + 2]))
                    login_pack.token = temp
                    # 序列化
                    serializeToString = login_pack.SerializeToString()
                    print(serializeToString, type(serializeToString))
                    args = (704, len(serializeToString), 0, 1, 1, serializeToString)
                    fmt = ">iiihh{0}s".format(len(serializeToString))
                    data = struct.pack(fmt, *args)
                    self.send(data)
                def _on_connection_close(self):
                    print('Connection closed!')
                    self._ws_connection.tcp_client.close()
                    print('關閉socket,重新連接')
                    # self.connect(ag_url)
                def _on_connection_error(self, exception):
                    print('Connection error: %s', exception)
                def bind(self,player):
                    """綁定ag的wss連接"""
                    if player:
                        if player.ag_wss:
                            player.ag_wss.close()
                        self.player.ag_wss = self
                        print('!!!!!!綁定到ag完成!!!!!!')
            def player_client(name,passwd,table_id,player):
                """玩家登陸創建客戶端"""
                if name:
                    if passwd:
                        if table_id > 0xFFFE:
                            if player:
                                client = AppWebSocketClient(connect_timeout=DEFAULT_CONNECT_TIMEOUT,
                                                            request_timeout=DEFAULT_REQUEST_TIMEOUT,
                                                            name=name,
                                                            passwd=passwd,
                                                            player= player)
                                client.connect(ag_url)

            posted on 2020-01-03 19:41 Benjamin 閱讀(1218) 評論(0)  編輯 收藏 引用 所屬分類: python

            久久久久久青草大香综合精品| 久久精品无码一区二区WWW| 日本精品久久久久久久久免费| 日产精品久久久久久久性色| 久久婷婷五月综合色奶水99啪| 欧美激情精品久久久久久久九九九 | 久久96国产精品久久久| 精品久久久久久中文字幕人妻最新| 伊人久久大香线蕉av不变影院| 一本色道久久综合狠狠躁| 久久久久青草线蕉综合超碰| 99久久精品免费看国产一区二区三区 | 久久精品亚洲一区二区三区浴池| 亚洲国产精品无码久久久蜜芽| 国产成人无码精品久久久性色| 99久久精品免费看国产一区二区三区| 久久精品综合网| 亚洲第一极品精品无码久久| 久久精品国产亚洲av日韩| 国产精品久久久久9999高清| 国产99久久九九精品无码| 亚洲Av无码国产情品久久| 亚洲国产另类久久久精品黑人| 久久99亚洲网美利坚合众国| 久久久中文字幕| 亚洲&#228;v永久无码精品天堂久久| 2021国内久久精品| 国产精品久久久久久久| 久久久久亚洲AV无码专区网站 | 久久国产乱子伦精品免费午夜| 久久影院亚洲一区| 久久久久亚洲av无码专区| 狠狠色综合久久久久尤物| 久久久久精品国产亚洲AV无码| 99久久777色| 亚洲精品国产自在久久| A狠狠久久蜜臀婷色中文网| 中文字幕无码久久精品青草| 久久国产热精品波多野结衣AV| 久久久久久av无码免费看大片| 乱亲女H秽乱长久久久|