【发布时间】:2021-09-30 02:59:58
【问题描述】:
我想做的事:
为了学习游戏编程,我使用专用服务器和 UDP 创建了一个回声设置。专用服务器位于不同的城市(也就是不在我的本地网络中)。
在我的本地计算机上,我有一个 udp 客户端和服务器(2 个不同的程序)。当我第一次启动我的 python 服务器时,windows 防火墙立即询问我是否要添加异常。在允许我的 python 服务器联网后,我仍然没有收到任何消息。 (客户端 -> 专用服务器 -/-> 本地服务器)
只有在路由器中设置端口转发后,我才能在本地 UDP 服务器上接收消息。
我的问题是:
游戏如何解决这个问题?我没有为每个我想玩的多人游戏激活端口转发,我仍然能够在所有这些游戏中接收数据。
我的专用服务器设置(地址和端口故意更改):
#!/usr/bin/python3
import socket
ADDRESS = "1.123.123.123"
PORT = 12345
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((ADDRESS, PORT))
clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addresses = []
while True:
data, addr = serverSock.recvfrom(1024)
if addr not in addresses:
addresses.append(addr)
msg = str(data)
#if msg.split()
print("Message: " + str(data))
outMsg = str(addr) + ":" + msg
for ad in addresses:
print("Send Msg " + outMsg + " to " + ad[0] + ":" + str(PORT))
clientSock.sendto(bytes(outMsg, "utf-8"), (ad[0], 12345))
print("Addresses: " + str(addresses))
【问题讨论】:
-
我会等几天再给我的答案打勾,看看是否有人能给出更好的解释。
-
*.com/questions/14915380/… 这似乎在不同的上下文中解决了相同的问题。解决方案是使用 TCP,因为套接字是明确的双向的。然而 TCP 是由于复杂的传输机制,对于游戏来说不是一个好的选择(至少对于允许丢包的连续数据传输来说不是)
标签: sockets networking udp game-engine portforwarding