Python: 幾種websocket的鏈接方式

轉載:https://blog.csdn.net/Darkman_EX/article/details/82592118

第一種, 使用create_connection鏈接,需要pip install websocket-client (此方法不建議使用,鏈接不穩定,容易斷,並且連接很耗時)

import time
from websocket import create_connection

url = 'wss://i.cg.net/wi/ws'
while True:  # 一直鏈接,直到連接上就退出循環
    time.sleep(2)
    try:
        ws = create_connection(url)
        print(ws)
        break
    except Exception as e:
        print('連接異常:', e)
        continue
while True:  # 連接上,退出第一個循環之後,此循環用於一直獲取數據
    ws.send('{"event":"subscribe", "channel":"btc_usdt.ticker"}')
    response = ws.recv()
    print(response)

第二種,運行效果很不錯,很容易連接,獲取數據的速度也挺快

import json
from ws4py.client.threadedclient import WebSocketClient


class CG_Client(WebSocketClient):

    def opened(self):
        req = '{"event":"subscribe", "channel":"eth_usdt.deep"}'
        self.send(req)

    def closed(self, code, reason=None):
        print("Closed down:", code, reason)

    def received_message(self, resp):
        resp = json.loads(str(resp))
        data = resp['data']
        if type(data) is dict:
            ask = data['asks'][0]
            print('Ask:', ask)
            bid = data['bids'][0]
            print('Bid:', bid)


if __name__ == '__main__':
    ws = None
    try:
        ws = CG_Client('wss://i.cg.net/wi/ws')
        ws.connect()
        ws.run_forever()
    except KeyboardInterrupt:
        ws.close()

第三種,其實和第一種差不多,只不過換種寫法而已,運行效果不理想,連接耗時,並且容易斷

import websocket

while True:
    ws = websocket.WebSocket()
    try:
        ws.connect("wss://i.cg.net/wi/ws")
        print(ws)
        break
    except Exception as e:
        print('異常:', e)
        continue
print('OK')
while True:
    req = '{"event":"subscribe", "channel":"btc_usdt.deep"}'
    ws.send(req)
    resp = ws.recv()
    print(resp)

第四種,運行效果也可以,run_forever裏面有許多參數,需要自己設置

import websocket


def on_message(ws, message):  # 服務器有數據更新時,主動推送過來的數據
    print(message)


def on_error(ws, error):  # 程序報錯時,就會觸發on_error事件
    print(error)


def on_close(ws):
    print("Connection closed ……")


def on_open(ws):  # 連接到服務器之後就會觸發on_open事件,這裏用於send數據
    req = '{"event":"subscribe", "channel":"btc_usdt.deep"}'
    print(req)
    ws.send(req)


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://i.cg.net/wi/ws",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever(ping_timeout=30)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章