簡體   English   中英

結合使用Asyncio Tcp Server和Tornado Web套接字

[英]Combine Asyncio Tcp Server and Tornado Web Socket

我有一個連接到5個TCP客戶端的asycnio tcp服務器。

import asyncio

class EchoServerClientProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: {!r}'.format(message))

        print('Send: {!r}'.format(message))
        self.transport.write(data)

        print('Close the client socket')
        self.transport.close()

loop = asyncio.get_event_loop()
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro)

# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

我也有一個連接到3個webbrowser的龍卷風websocket。

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

class WSHandler(tornado.websocket.WebSocketHandler):

    clients = []

    def check_origin(self, origin):
        return True

    def open(self):
        print('New Connection Established')
        self.write_message("Connected Server...")
        WSHandler.clients.append(self)

    def on_message(self, message):
        print('Message Received: {}'.format(message))

    def on_close(self):
        print('Connection Closed...')
        WSHandler.clients.remove(self)
        del self

    @classmethod
    def write_to_clients(cls, message):
        print("Writing to Clients")
        for client in cls.clients:
            client.write_message(message)

    @classmethod
    def write_to_other_clients(cls, self_client, message):
        print("Writing to Other clients")
        for client in cls.clients:
            if  self_client != client:
                client.write_message(message)


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



http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()

現在,我想將它們結合起來。這就是我想要做的:我的服務器將始終監聽我的客戶。 當其中任何一個數據到達時,程序將與Websocket一起異步發布到webbrowser。 我做了很多研究,但無法成功...

您可以使用龍卷風提供的asyncio和龍卷風之間橋梁

# Imports
import asyncio
import tornado.platform
# [...]

# Define Tornado application
class WSHandler(tornado.websocket.WebSocketHandler):
    clients = []
    # [...]
application = tornado.web.Application([(r'/', WSHandler)])

# Define asyncio server protocol
class EchoServerClientProtocol(asyncio.Protocol):
    def data_received(self, data):
        WSHandler.write_to_clients(data.decode())
    # [...]

# Install asyncio event loop
tornado.platform.asyncio.AsyncIOMainLoop().install()
loop = asyncio.get_event_loop()

# Create tornado HTTP server   
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)

# Start asyncio TCP server
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8889)
server = loop.run_until_complete(coro)

# Run forever
loop.run_forever()
# [...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM