【发布时间】:2019-04-11 12:41:08
【问题描述】:
所以我编写了一个简单的 python 服务器来设置 P2P 连接(用于我正在制作的游戏)。
服务端代码很简单(python):
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ''
server_port = 5000
server = (server_address, server_port)
sock.bind(server)
print("Listening on " + server_address + ":" + str(server_port))
while True:
payload, client_address = sock.recvfrom(1)
resp = client_address[0] + ":" + str(client_address[1])
print("Echoing data back to " + str(client_address))
sent = sock.sendto(str.encode(resp), client_address)
它侦听传入的 UDP 消息并以客户端的公共 ip:port 信息(例如“xxx.yyy.zzz.aaa:port”)进行响应。 p>
客户端从服务器接收此信息并在 Firebase 上更新其 ip:port 信息。 Firebase 游戏大厅中的所有玩家都可以看到他们的对手 ip:port 信息。
但是,下一部分 - P2P - 不起作用。 一旦客户端获得了他们的对手的公共 ip:port 信息并开始发送 UDP 数据包,它们都不会到达。
有人知道可能是什么问题吗?
***** 编辑 ***** 我已经解决了这个问题..根据我提供的上述信息,任何人都无法回答。在得到服务器的第一个响应后,我愚蠢地没有更新端口以接收新的 udp 数据包。感觉很愚蠢的atm。 无论如何,UDP 打孔系统似乎正在工作。 我的服务器是上面的python代码,客户端是带有firebase后端的统一游戏(c#)。如果有人有问题,请告诉我。
【问题讨论】:
-
@Dennis19901 的评论:您能分享一下实现的 UDP 打孔的代码 sn-p 吗?我计划尽快自己解决这个问题,这样可以节省我大量的研究时间!
-
@gofr1 - 你有兴趣看哪一部分?服务器(python)代码,还是 C# P2P 客户端代码?
-
感谢您的反馈。我发布了来自@Dennis19901 的问题,我希望他能尽快澄清他的问题! :)
-
感谢您通知我@gofr1 我对 P2P 客户端代码最感兴趣。您如何首先设置与服务器的连接,然后是另一个客户端。我猜服务器只将两个客户端的远程 IP 交给对方?
-
@Dennis19901- 我的设置布局有点混乱,因为它使用 firebase 服务器和 python (linux) 服务器来设置连接。基本上,玩家都在游戏大厅中(使用 firebase 管理)。一旦大厅被填满,他们都会使用空的 UDP 数据包 ping python 服务器。 python 服务器看到这些客户端公共 ip:port 信息进来,并以他们自己的 ip:port 数据作为消息响应(见上文)。玩家从 python 服务器响应中获取 ip:port 数据(他们自己的),然后填写 firebase 游戏大厅的字段。
标签: c# python udp hole-punching