TCP 和 UDP 结合

TCP and UDP combined

我计划为我的游戏服务器TCP/IP和 UDP 协议一起。我已经在 java 中设置了服务器,在 c++ 中设置了客户端,并让它们都使用 TCP/IP 协议与一个漂亮的 gui 连接。我需要它们是 UDP 交互,因为 UDP 协议允许丢失数据包,这对于具有位置和其他正在传输的更新的在线游戏来说是必不可少的,如果发生错误则不会有益于重新发送。当我尝试将客户端和服务器转换为 UDP 协议时出现了问题。在 java 中,我注意到创建 UDP 连接会更加困难,因为它不像绑定到端口并等待连接恕我直言那么容易,所以:

Is it possible via the UDP protocol, or any other protocol, to have my server "broadcast" data, such as entity location, and allow the client to receive the data without having to pragmatically establish a permanent connection to that server.

您只能做到这些,因为 UDP 没有永久连接的概念。它只支持数据报。

If the above is a no, is it possible to use the UDP and TCP/IP protocols together without having to establish two separate connection.

UDP 是无连接的,不会有 "separate connection"。可能最好的思考方式是连接是 TCP 的东西,但是当连接存在时也可以使用 UDP 发送数据。

由于 UDP 并不总是在 Internet 上工作,我强烈建议将传输层与其他程序逻辑分开。您的传输层可以建立 TCP 连接,并使用 TCP 连接同意尝试 UDP。如果 UDP 有效,您的层可以通过 UDP 连接路由最好通过 UDP 发送的数据。如果 UDP 失败,您可以将该数据包含在 TCP 连接中。您需要设计自己的 encapsulation/messaging 协议以用于 TCP 连接,包括协商和测试 "side" UDP 连接的能力。

您应该记住,TCP 的功能远不止重传,如果您需要许多其他功能,使用 TCP 可能比使用 UDP 更好。尤其如此,因为 TCP 层是由网络专家开发并内置于操作系统中,即使您不必担心重传,您也不太可能做得更好。其中一些是:

会话设置、拆除和跟踪
最后的 ACK 处理和拜占庭失败
慢启动
校验和和验证
指数退避
重新排序
重复检测
路径MTU检测
路径带宽检测
附带致谢
死连接检测
"Short"数据包规避
还有更多。

UDP 是无连接的,它的工作原理是向接收方发送数据报并希望它能到达目的地(没有确认或类似 TCP 的任何东西)

看看这个例子:

Java UDP server and client

也许可以阅读文档:

Writing a datagram client and server