如何在Python中使用tulip / asyncio创建中继服务器?
发布时间:2020-12-20 12:05:50 所属栏目:Python 来源:网络整理
导读:我有 example echo server import asyncioclass EchoServer(asyncio.Protocol): def connection_made(self,transport): peername = transport.get_extra_info('peername') print('connection from {}'.format(peername)) self.transport = transport def dat
我有
example echo server
import asyncio class EchoServer(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): self.transport.write(data) # Client piece goes here loop = asyncio.get_event_loop() coro = loop.create_server(EchoServer,'127.0.0.1',8888) server = loop.run_until_complete(coro) print('serving on {}'.format(server.sockets[0].getsockname())) try: loop.run_forever() except KeyboardInterrupt: print("exit") finally: server.close() loop.close() 我正在尝试做的是添加一个客户端部分,我评论说它将连接到一台新服务器并从那个方向发送数据.这是echo client,但我需要一个看起来像这样的流程: +-----------+ +-----------+ +--------------+ | My Server | | My Client | | Other Server | +-----------+ +-----------+ +--------------+ | | | ===>Get some data | | | | | Send data ---------->| | | | | | Send data ----------->| | | | | | Do Stuff | | | | | <-----------Send Data | | | | <--------- Send data | | | | <=== Send data | | | | | | | | | | | | | | 显然,我可以同步执行此操作,但我正在尝试创建客户端 – >其他服务器位异步,我真的不知道如何使用asyncio方法在我的服务器块和客户端之间进行通信. 我需要做什么? 解决方法
这是一个简单的代理,允许你wget 127.0.0.1:8888并从谷歌得到一个HTML回复:
import asyncio class Client(asyncio.Protocol): def connection_made(self,transport): self.connected = True # save the transport self.transport = transport def data_received(self,data): # forward data to the server self.server_transport.write(data) def connection_lost(self,*args): self.connected = False class Server(asyncio.Protocol): clients = {} def connection_made(self,transport): # save the transport self.transport = transport @asyncio.coroutine def send_data(self,data): # get a client by its peername peername = self.transport.get_extra_info('peername') client = self.clients.get(peername) # create a client if peername is not known or the client disconnect if client is None or not client.connected: protocol,client = yield from loop.create_connection( Client,'google.com',80) client.server_transport = self.transport self.clients[peername] = client # forward data to the client client.transport.write(data) def data_received(self,data): # use a task so this is executed async asyncio.Task(self.send_data(data)) @asyncio.coroutine def initialize(loop): # use a coroutine to use yield from and get the async result of # create_server server = yield from loop.create_server(Server,8888) loop = asyncio.get_event_loop() # main task to initialize everything asyncio.Task(initialize(loop)) # run loop.run_forever() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |