【发布时间】:2013-08-27 22:14:50
【问题描述】:
为了好玩,我正在学习制作类似于 Bukkit 的 Minecraft 服务器。我以前和 NIO 打过交道,但不是很多,也不是很实用。我现在遇到一个问题,我的世界有许多可变长度的数据包,并且由于这些数据包没有任何一致的“标头”,NIO 正在做这个奇怪的事情,它将数据包分段,因为数据并不总是立即完整发送。
我最近从这个帖子中了解到这是一件事:Java: reading variable-size packets using NIO 我宁愿不使用 Netty/MINA/etc。因为我想自己学习这一切,因为我这样做是为了教育,而不是想把它变成一个巨大的项目。
所以我的问题是,我该如何防止这种数据包碎片化?我尝试在java.net.Socket#setTcpNoDelay(boolean on) 中使用 Nagle 的算法,但奇怪的是,所有这些都是为了使每次发送数据包时都会分段,而当我没有启用它时,第一个数据包总是通过 OK,然后后面的数据包就会变成碎片。
我非常密切地关注Rox Java NIO Tutorial,所以我知道这段代码应该可以工作,但该教程仅将字符串消息回显给对等方,而不是复杂的字节流。
这是我的代码。在某些情况下,我使用Executor#execute(Runnable) 创建两个线程。由于我仍在学习线程和并发性并尝试将它们与网络拼凑在一起,因此也非常感谢您对此的任何反馈!
ServerSocketManager ServerDataManager
非常感谢,我知道这是相当多的东西,所以我不能感谢你花时间阅读和回复!
【问题讨论】:
-
NIO 没有任何碎片。 TCP 就是这样做的。这是接收 TCP 流的正常行为。你必须相应地编码。
-
@EJP 所以...怎么样?对不起,如果它很笨,但我真的不知道该怎么做。