0

我正在学习制作类似于 Bukkit 的 Minecraft 服务器以获得乐趣。我以前和 NIO 打过交道,但不是很多,也不是很实用。我现在遇到一个问题,我的世界有许多可变长度的数据包,并且由于这些数据包没有任何一致的“标头”,NIO 正在做这个奇怪的事情,它将数据包分段,因为数据并不总是立即全部发送。

我最近从这个线程中了解到这是一件事:Java:使用 NIO 读取可变大小的数据包 我宁愿不使用 Netty/MINA/etc。因为我想自己学习这一切,因为我这样做是为了教育,而不是为了让它成为一个巨大的项目。

所以我的问题是,我究竟该如何防止这种数据包碎片化?我尝试使用 Nagle 的算法,java.net.Socket#setTcpNoDelay(boolean on)但奇怪的是,所有这些都是为了使每次发送数据包时都会分段,而当我没有启用它时,第一个数据包总是通过 OK,然后随后的数据包变得碎片化。

我非常密切地遵循了Rox Java NIO 教程,所以我知道这段代码应该可以工作,但该教程只是将字符串消息回显给对等方,而不是复杂的字节流。

这是我的代码。在某些情况下,我Executor#execute(Runnable)用来创建两个线程。由于我仍在学习线程和并发性并尝试将它们与网络拼凑在一起,因此也非常感谢任何反馈!

服务器套接字 管理器服务器数据管理器

非常感谢,我知道这是相当多的东西,所以我不能感谢你花时间阅读和回复!

4

1 回答 1

4

TCP 始终是字节流。您无法控制何时获得它们或获得多少。它可以随时以任何数量进入。这就是存在协议的原因。

标头是协议的常见部分,用于告诉您在获得整个消息之前需要读取多少数据。

所以这里的简短回答是:你不能。

你说你不想做的一切——这就是你必须做的。

于 2013-08-25T10:10:23.833 回答