Что я пытаюсь сделать
Я новичок в 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
работает в другом потоке, поэтому их выходные данные перекрываются, и, кроме того, я понимаю, что это неправильный способ сделать это.
Смотрите здесь
Выбор входа должен был быть внизу, но так как он работает в двух разных потоках, такпроблема с синхронизацией.
Чего я хочу достичь
Посмотрите, что клиент веб-сокета (в процессе) работает, чистый ввод и соответствующий вывод нет перекрытия вывода и более того нет бесконечный цикл .
Есть лилюбой чистый способ сделать это?
Спасибо
Temporarya
(Noobie Python)