加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何在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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读