1

尝试为连接到 Java 服务器的我的游戏(在 GameMaker: Studio 中制作)开发可靠的 UDP 协议。我需要确保数据包到达并且它们以正确的顺序到达。

我试图模拟 TCP 协议来做到这一点,而让我困惑的一件事是 3 次握手:它什么时候发生?

握手基本上是当你第一次连接到某个东西时?只做过一次吗?(直到连接断开)

如果是这种情况,那么我将哪些数据附加到常规数据包中?

假设我有最初的 3 个连接数据包:SYN -> SYN-ACK -> ACK

让我们假设这一切进展顺利,我们已经连接好了。

然后假设我想向服务器发送一条消息:“你好”。我基本上是SYN -> SYN-ACK -> ACK为这条消息做的吗?我究竟在这个消息包/数据报上附加了什么以确保它按顺序到达和到达?

4

2 回答 2

2

然后假设我想向服务器发送一条消息:“你好”。我基本上是在为这条消息做 SYN -> SYN-ACK -> ACK 吗?

不,数据包的传输没有任何保证。

我究竟在这个消息包/数据报上附加了什么以确保它按顺序到达和到达?

您可以在数据包中添加一个序列号并以编程方式对其重新排序:如果您收到数据包 1、2、3 和 5,则必须等待数据包 4。

我需要确保数据包到达并且它们以正确的顺序到达。

如果您需要重新传输和有序到达(并且可能避免重复),那么很难以编程方式对 TCP 做一些更好的事情!

于 2021-01-08T12:50:41.013 回答
1

根据我的经验,我使用 UDP 发送广播数据包(只是数据包 id 以了解我收到的内容)以获取在当前网络中创建的每个服务器。想象一个名为“A”的客户端在网络中寻找可能的匹配项。等待玩家的其他客户端正在广播中发送 UDP 数据报,以便该网络中的每个人都知道它们。客户端“A”连接到匹配后,主机通过 TCP 与“A”链接,以获得稳定的连接。要获取数据包的顺序,请发送一个初始 id 数字,以便客户端收到数据包时知道他收到了什么(例如 id=1 --> ping, id=2 --> player_position, id=3 --> hp_update )。您应该以编程方式获取数据包的顺序。

于 2021-02-23T18:05:51.647 回答