游戏客户端如何从服务器接收UDP数据



我想做的事情:
为了学习游戏编程,我使用专用服务器和UDP创建了一个echo设置。专用服务器在另一个城市(也就是不在我的本地网络中(。

在我的本地计算机上,我有一个udp客户端和服务器(两个不同的程序(。当我第一次启动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))

我在写问题时(就像和一只好的老橡皮鸭说话一样(弄明白了这个问题:

诀窍是不要在本地计算机上使用2个程序。发送消息的程序也需要检索消息。在我的例子中,它是阻塞调用(丑陋!(,对于一个你想使其异步的游戏。但这是绕过路由器防火墙的最简单方法:

#! /usr/bin/python3
import socket
ADDRESS = "1.123.123.123"
PORT = 12345
clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# usually not required to bind a client, but we want to receive messages
clientSock.bind(("0.0.0.0",PORT))
while True:
msg = input("Enter message: ")
# Note that it is not required to send to the same port 
# you have locally binded to.
clientSock.sendto(bytes(msg, "utf-8"), (ADDRESS, PORT))
# listen to the echo:
data, addr = clientSock.recvfrom(1024)
print(str(data) + " from " + str(addr))

然而,我对套接字和防火墙的理解是有限的。我不明白为什么THIS有效,但两个单独的程序不起作用。也许有人可以对此发表评论。希望我能为某人节省一些时间

最新更新