我想用Python运行一个程序,通过web套接字每秒向Tornado服务器发送一条消息,我已经在websocket-client上使用了这个例子;
这个例子不起作用,因为ws.run_forever()
将停止while循环的执行。
有人能给予我一个例子,告诉我如何正确地将它实现为一个线程类,我既可以调用它的send方法,也可以接收消息?
import websocket
import thread
import time
def on_message(ws, message):
print message
def on_error(ws, error):
print error
def on_close(ws):
print "### closed ###"
def on_open(ws):
pass
if __name__ == "__main__":
websocket.enableTrace(True)
ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
ws.run_forever()
while True:
#do other actions here... collect data etc.
for i in range(100):
time.sleep(1)
ws.send("Hello %d" % i)
time.sleep(1)
2条答案
按热度按时间oymdgrw71#
他们的github page中有一个例子就是这样做的。看起来你是从那个例子开始的,把每秒发送消息的代码从 on_open 中取出,粘贴到 run_forever 调用之后,BTW会一直运行到套接字断开连接。
也许你对这里的基本概念有疑问。总有一个线程专门监听套接字(在这个例子中,主线程进入 run_forever 内的循环等待消息)。如果你想有其他事情要做,你需要另一个线程。
下面是他们的示例代码的不同版本,其中不使用主线程作为“套接字侦听器”,而是创建另一个线程,并在那里运行 run_forever。我认为这有点复杂,因为您必须编写代码以确保套接字已连接,而您可以使用 on_open 回调,但它可能会帮助您理解。
huus2vyu2#
在2023年,他们有一个更新的例子,使用像rel这样的异步调度器来调度多个WebSocketApp。
希望能有所帮助!