Python.Запускать клиентские и серверные веб-сокеты в одном скрипте через 2 потока? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать приложение, в котором между клиентами и сервером веб-сокета end есть второй сервер веб-сокетов, вроде как

 --------       ----------       ----------
| CLIENT | <-> | SERVER A | <-> | SERVER B |
 --------       ----------       ----------

Сервер B можно записатьна любом языке и это не проблема, клиенты написаны на python и, опять же, не проблема.Проблема, с которой я сталкиваюсь, заключается в кодировании SERVER A. Очевидно, что он должен быть одновременно сервером для клиентов и клиентом SERVER B.Я предполагаю, что это должно быть сделано через многопоточность.Также необходимо, чтобы оба потока могли отправлять данные друг другу, поэтому сервер SERVER A может пересылать клиентские сообщения серверу B и наоборот.Прямо сейчас я использую Tornado, но пока я могу заставить это работать, мне действительно все равно, какую библиотеку использовать.У меня также не возникло бы проблем с изменением языка, если бы это помогло решить мою проблему.

Сейчас у меня есть базовый код клиента и сервера, я не знаю, как их объединить и заставить их работать вместе в несколькихнить.

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

clients = []

def send_to_all_clients(message):
    for client in clients:
        client.write_message(message)

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.write_message("The server says: 'Hello'. Connection was accepted.")
        send_to_all_clients("new client")
        clients.append(self)

    def on_close(self):
        clients.remove(self)
        send_to_all_clients("removing client")

    def on_message(self, message):
        for client in clients:
            if client != self:
                client.write_message('ECHO: ' + message)

application = tornado.web.Application([
  (r'/ws', WSHandler),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(1234)
    tornado.ioloop.IOLoop.instance().start()
import tornado.websocket
from tornado import gen 

@gen.coroutine
def test_ws():
    client = yield tornado.websocket.websocket_connect("ws://localhost:1234/ws")

    client.write_message("This is client 1")
    while True:
            msg = yield client.read_message()
            print("msg is %s" % msg)
            if msg is None:
                print ("connection closed")
                break

if __name__ == "__main__":
    tornado.ioloop.IOLoop.instance().run_sync(test_ws)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...