отправка и получение данных из веб-сокетов без блокировки кода - PullRequest
0 голосов
/ 08 февраля 2019

Что я пытаюсь сделать

Я новичок в 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

Выбор входа должен был быть внизу, но так как он работает в двух разных потоках, такпроблема с синхронизацией.

Чего я хочу достичь

Посмотрите, что клиент веб-сокета (в процессе) работает, чистый ввод и соответствующий вывод нет перекрытия вывода и более того нет бесконечный цикл .

Есть лилюбой чистый способ сделать это?

Спасибо
Temporarya
(Noobie Python)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...