Я пытаюсь создать приложение, в котором между клиентами и сервером веб-сокета 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)