繁体   English   中英

使用python 3.6异步的UDP代理服务器

[英]UDP Proxy server using python 3.6 async

我很想知道如何使用异步模块创建UDP代理服务器。 我今天早些时候和Twisted一起尝试过,但没有取得多大进展。 我确实在stackoverflow上直接使用套接字找到了一些简单的解决方案,但我想知道是否可以使用async lib。

为清楚起见,我正在寻找的是:

步骤1:客户端A(可以很多)与代理B通话步骤2:代理B将请求发送到服务器C.步骤3:服务器C响应代理B 9月4日:代理B响应客户端A.

这是我到目前为止所拥有的:

import asyncio

class EchoServerProtocol(asyncio.DatagramProtocol):
    def connection_made(self, transport):
        self.transport = transport

    def datagram_received(self, data, addr, args=None):
        message = data
        server_addr = ('localhost', 27015)
        print('Received %r from %s' % (message, addr))
        print('Send %r to %s' % (message, server_addr))
        self.transport.sendto(data, server_addr)

loop = asyncio.get_event_loop()
print("Starting UDP server")
# One protocol instance will be created to serve all client requests
listen = loop.create_datagram_endpoint(
    EchoServerProtocol,
    local_addr=('0.0.0.0', 27016),
)
transport, protocol = loop.run_until_complete(listen)

try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

transport.close()
loop.close()

以上基本上是这样的:

https://docs.python.org/3/library/asyncio-protocol.html#udp-echo-server-protocol

我所拥有的将会带你到第3步,但当然在第4步失败了。它将它发送回服务器C.

您将注意到其他协议示例之一EchoServerClientProtocol为每个连接创建一个新实例。 我认为我需要为每个连接创建一个新实例,因为我可以将原始地址存储在实例中,然后返回。 我假设这不适用于create_datagram_endpoint ,或者我无法弄清楚如何做到这一点。

可能有更好的方法。

您需要服务器B的本地端点,以及每个客户端A的服务器C的远程端点。

这是一个可能的实现

此外,您可能对此模块感兴趣, 该模块为asyncio提供高级UDP端点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM