从websocket发送和接收数据而不会阻塞代码

时间:2019-02-08 17:22:34

标签: python websocket

我要做什么

我对python还是很陌生,最近开始研究python websocket客户端。

因此,它的主要作用是发送消息并基于此执行一些操作。

当前,我正在使用input()来获取要发送到服务器的数据,但是当input工作时,我如何接收网络套接字消息。

我的解决方案(我知道是丑陋的)

我尝试在新线程上运行websocket,但是我正在使用无限循环以避免退出,是

import websocket
try:
    import thread
except ImportError:
    import _thread as thread
import time
import json

# Client Message structure : json --> {"data": "", "operation": "", "watch": ""}
# Server Message Structure : json --> {"status": 0/1 --> error/success , "message": will contain response message }

RED, WHITE, GREEN, END, YELLOW = '\033[91m', '\33[97m', '\033[1;32m', '\033[0m', '\33[93m'

def init(ws):
    ws.send(json.dumps({"data":"", "operation":"init"}))


def main(ws):
    init(ws)
    while True:
        try:
            data = input()
            message = {"operation":operation, "data":data}
            ws.send(json.dumps(message))
        except Exception as e:
            print(e)
        except KeyboardInterrupt:
            print("User has pressed {0}Ctrl+C{1}".format(RED,END))
            print("Exiting ...")
            ws.close()
            break


def on_message(ws, message):
    print("\nNew Message")
    recv_msg = json.loads(message)
    if recv_msg["status"] == 1:
        print("{0}{1}{2}".format(GREEN, recv_msg["message"], END))
    else: # Error Message
        print("{0}{1}{2}".format(RED, recv_msg["message"], END))

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

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    def run(*args):
        main(ws)
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://127.0.0.1:5000/ws",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    ws.on_open = on_open
    ws.run_forever()

以上代码摘自websocket client

问题

input()正在阻塞并且websocket正在其他线程上运行,因此它们的输出重叠,而且我知道这不是执行此操作的正确方法。

查看此处

enter image description here

输入选择应该在底部,但是由于它在两个不同的线程中运行,因此出现同步问题。

我想实现的目标

看到此websocket client (in go)正常工作,清理输入和相应的输出没有输出重叠,而且没有无限循环

有什么干净的方法吗?

谢谢
Temporarya
(python noobie)

0 个答案:

没有答案