我正在尝试使用 java 服务器和游戏制作工作室客户端开发游戏。我已经编写了一些基本的连接代码,它在我的本地网络中运行良好。但是当我托管服务器并尝试连接时,我的客户端会获取服务器分配的 ID,该 ID 通过 TCP 发送,但它没有收到任何由 UDP 协议发送的命令。服务器如何无法通过 UDP 建立连接,而可以通过 TCP 建立连接。我听说我需要 UDP 打孔。但是,一旦我编写了具有游戏制作工作室网络功能的服务器,UDP 就能够在服务器上建立与相同配置的连接。所以他们在他们的内置功能中使用打孔?如果我需要实施打孔,我应该只使用 TCP 还是应该不惜一切代价学习打孔?
问问题
650 次
1 回答
3
这里有很多问题,所以我将尝试将它们逐个分解。首先...
NAT 是否会阻止来自使用 TCP 连接的服务器的 UDP 数据包?
是的。NAT 已经在两台机器之间建立了 TCP 连接并不意味着它也会自动转发 UDP 数据包。
服务器如何无法通过 UDP 建立连接而可以通过 TCP 建立连接?
TCP 是面向连接的协议,而 UDP 是无连接协议,因此在技术上不存在“UDP 连接”之类的东西。当两台计算机通过 UDP 通信时,它们只是来回交换 UDP 数据包,并且“连接”是隐含的(或在更高级别管理),而不是由 UDP 协议本身说明。
我听说我需要 UDP 打孔...如果我需要实现打孔,我应该只使用 TCP 还是应该不惜一切代价学习打孔?
UDP 打孔是一种可能性,但它很复杂,并且不能 100% 保证所有 NAT 都兼容。相反,您可以仅使用 TCP 构建您的游戏,然后在它运行和部署后,尝试使用更高级的通信通道,如 UDP 打孔或 WebRTC 数据通道。
于 2017-11-09T22:54:20.620 回答