• <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 閱讀(1225) 評論(0)  編輯 收藏 引用 所屬分類: python

            久久综合香蕉国产蜜臀AV| 思思久久99热只有频精品66| 热re99久久精品国99热| 久久精品国内一区二区三区| 亚洲Av无码国产情品久久| AV无码久久久久不卡蜜桃| 久久国产精品-国产精品| 一级女性全黄久久生活片免费| 久久精品国产亚洲AV麻豆网站| 国产精品午夜久久| 欧洲成人午夜精品无码区久久 | 国产精品久久婷婷六月丁香| 狠狠色丁香婷婷久久综合五月 | 亚洲va久久久噜噜噜久久| 热99re久久国超精品首页| 77777亚洲午夜久久多喷| 久久久久亚洲精品中文字幕| 97r久久精品国产99国产精| 思思久久精品在热线热| 久久国产热这里只有精品| 欧美亚洲国产精品久久蜜芽| 久久99精品久久久久久久不卡| 久久强奷乱码老熟女网站 | 欧洲精品久久久av无码电影| 国产精品99久久久精品无码| 久久精品国产只有精品66| 久久这里只有精品久久| 国产午夜福利精品久久2021| 久久精品亚洲日本波多野结衣| 久久亚洲日韩看片无码| 超级碰碰碰碰97久久久久| 久久人人爽人人爽人人片AV东京热| 91亚洲国产成人久久精品网址| 久久国产精品久久国产精品| 欧美噜噜久久久XXX| 久久精品国产亚洲精品2020| 久久精品亚洲日本波多野结衣| 国产亚洲综合久久系列| 国产精品久久波多野结衣| 久久九九亚洲精品| 久久精品一区二区影院|