gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:32 24 4
gpt4 key购买 nike

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

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

第 1 步:客户端 A(可以是多个)与代理 B 对话第 2 步:代理 B 将请求连同服务器 C 一起发送。第三步:服务器C响应代理B9月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。

您会注意到其他协议(protocol)示例之一 EchoServerClientProtocol 会为每个连接创建一个新实例。我认为我需要为每个连接创建一个新实例,我相信,因为这样我就可以将原始地址存储在实例中,然后返回它。我假设这不适用于 create_datagram_endpoint,或者我不知道该怎么做。

虽然可能有更好的方法。

最佳答案

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

这里是 a possible implementation .

此外,您可能对 this module providing high-level UDP endpoints for asyncio. 感兴趣

关于python - 使用 python 3.6 异步的 UDP 代理服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41966132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com