Java NIO server how to read variable-len packets w/out any header
I'm learning to make Minecraft servers similar to Bukkit for fun. I've
dealt with NIO before but not very much and not in a practical way. I'm
encountering an issue right now where Minecraft has many variable-length
packets and since there's not any sort of consistent "header" for these
packets of data, NIO is doing this weird thing where it fragments packets
because the data isn't always sent immediately in full.
I learned recently that this is a thing from this thread: Java: reading
variable-size packets using NIO I'd rather not use Netty/MINA/etc. because
I'd like to learn this all myself as I'm doing this for the education and
not with the intention of making it some huge project.
So my question is, how exactly do I go about preventing this sort of
fragmenting of packets? I tried using Nagle's algorithm in
java.net.Socket#setTcpNoDelay(boolean on) but oddly enough, all this does
is make it so that every single time the packet is sent, it's fragmented,
whereas when I don't have it enabled, the first packet always comes
through OK, and then the following packets become fragmented.
I followed the Rox Java NIO Tutorial pretty closely so I know this code
should work, but that tutorial only went as far as echoing a string
message back to peers, not complicated bytestreams.
Here's my code. For some context, I'm using Executor#execute(Runnable) to
create the two threads. Since I'm still learning about threads and
concurrency and trying to piece them together with networking, any
feedback on that would be very appreciated as well!!
ServerSocketManager ServerDataManager
Thanks a lot, I know this is quite a bit of stuff to take in, so I can't
thank you enough for taking the time to read & respond!!
No comments:
Post a Comment