拥有中央服务器如何绕过 NAT 之类的事情

问题描述

我正在尝试开发一个小型多人游戏,并且我已经阅读了很多关于 NAT 如何使 P2P 变得不可能的文章。 另一方面,我已经阅读了很多看起来像这样的服务器代码

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

def datagram_received(self,data,addr):
    message = data.decode()
    print('Received %r from %s' % (message,addr))
    print('Send %r to %s' % (message,addr))
    self.transport.sendto(data,addr)

在上面的代码中,服务器仅使用普通 IP 地址与客户端通信。 同样this stackoverflow question

那么我在这里缺少什么 - 有没有另一种方法来编写 UDP 发送调用,或者让它们坐在服务器上自动神奇地解决 NAT?

解决方法

关键部分是这个:client.Connect(ep);。客户端是打开与服务器的连接的那个。如果建立了连接,客户端的路由器就知道将传入的数据包通过公共端口路由到何处。

只有一台服务器并不能解决 NAT 问题。会存在与 P2P 相同的问题。