如何将从websocket收到的on_message数据返回到类之外?使用python websocket-client

时间:2019-04-07 19:12:18

标签: python websocket

我试图使我的代码从Websocket连接中获取一些数据,然后使用WS响应中的数据。问题是,我不知道如何使代码等待WS答案,然后将数据“发送”到WS类之外。

我正在使用此websocket-client lib(https://github.com/websocket-client/websocket-client),并使用该页面上的“长期连接”示例。

import websocket
import _thread as thread
import time, json

class Frame:
  def __init__(self):
    self.m = 0 
    self.i = 0 
    self.n = ""
    self.o = ""

class MyWS():
    def __init__(self):
        self.wsadd = 'ws://websocket.org/' #Example 
        self.frame = Frame()

        self.openWS()

    def on_message(self, message):
        msg = json.loads(message)
        print(msg)
        if msg["n"] == 'SubscribeData':
            self.sub = json.loads(msg['o'])
            return self.sub #It doesn't seem to do anything

    def on_error(self, error):
        print(error)

    def on_close(self):
        print("WS closed")

    def on_open(self):
        def run(*args):
            print('WS Open')
            #self.Authenticate() #Commented because haven't code it yet
            #self.sendWS()
            thread.start_new_thread(run, ())

    def openWS(self):
        websocket.enableTrace(True)
        self.ws = websocket.WebSocketApp(self.wsadd, on_message = self.on_message, on_open = self.on_open, on_error = self.on_error, on_close = self.on_close)
        self.wst = threading.Thread(target=lambda: self.ws.run_forever())
        self.wst.daemon = True
        self.wst.start()

    def sendWS(self):
        self.ws.send(json.dumps(self.frame.__dict__))


    def SubscribeData(self):
        self.frame.m = 0
        self.frame.i = int(time.time())
        self.frame.n = 'SubscribeData'
        payload = {
            "OMSId": 1,
            "InstrumentId": 1,
            }
        self.frame.o = json.dumps(payload)
        self.sendWS(self.frame)
        #return #Should return something here?

obj = MyWS() #When the obj is instantiated the WS Connection is opened.

result = obj.SubscribeData() #This sends a request for subscribing to the datafeed. It get's an answer but isn't saved in the variable. (because the method doesn't really return anything)

print(result) #prints None

当我实例化MyWS类时,WS连接是开放式的。

当我使用SubscibeData方法时,我得到了预期的响应。 因此websocket部分工作正常。

on_message方法将响应保存在self.sub中,但未在任何地方返回。

我真正需要的是一种将接收到的数据发送到类外部的方法,这样“外部代码”不仅可以等待接收数据,还可以对其进行操作

我对websockets还很陌生,所以您知道...

1 个答案:

答案 0 :(得分:1)

要回答@ HJA24以及还有谁可能绊倒这个问题,我并未真正找到解决这个问题的(好的)解决方案,但提出了解决方法。

由于on_message方法将返回值保存在self.sub中,所以我创建了另一个返回self.sub值的方法,因此可以访问WS响应。如果您决定使用此方法,则必须考虑以下事实:与您调用返回值的方法所花费的时间相比,WS可能需要更长的时间来回答您。

类似这样的东西:

import websocket
import ...

class MyWS():
    def __init__(self):
        self.wsadd = 'ws://websocket.org/' #Example 
        self.frame = Frame()
        self.openWS()

    def on_message(self, message):
        msg = json.loads(message)
        if msg["n"] == 'SubscribeData':
            self.sub = json.loads(msg['o'])

    def get_subscribe_data(self):
        return self.sub

    def on_error(self, error):
        ...

obj = MyWS() #When the obj is instantiated the WS Connection is opened.

obj.SubscribeData()
result = obj.get_subscribe_data()
print(result) #prints the data on self.sub

我不接受我自己的答案,因为肯定有更好的方法来执行此操作,因此,如果您正在阅读此书并有想法,请随时分享。