我试图使我的代码从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还很陌生,所以您知道...
答案 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
我不接受我自己的答案,因为肯定有更好的方法来执行此操作,因此,如果您正在阅读此书并有想法,请随时分享。