Minecraft サーバーを Bukkit に似たものにする方法を学んでいます。私は以前にNIOを扱ったことがありますが、あまり実用的ではありませんでした。私は現在、Minecraft に多くの可変長パケットがあるという問題に遭遇しています。これらのデータ パケットには一貫した「ヘッダー」が存在しないため、NIO はパケットを断片化するという奇妙なことを行っています。すぐに完全に送信されます。
私は最近、これが次のスレッドからのものであることを知りました 。私は教育のためにこれを行っているので、これをすべて自分で学びたいので、巨大なプロジェクトにするつもりはありません。
私の質問は、この種のパケットの断片化を防ぐにはどうすればよいですか? Nagle のアルゴリズムを使用してみましjava.net.Socket#setTcpNoDelay(boolean on)
たが、奇妙なことに、パケットが送信されるたびに断片化されるようにするだけですが、有効にしないと、最初のパケットは常に正常に送信され、次に次のパケットはフラグメント化されます。
私はRox Java NIO チュートリアルをかなり厳密に従ったので、このコードが機能することはわかっていますが、そのチュートリアルは、複雑なバイトストリームではなく、文字列メッセージをピアにエコーすることしかできませんでした。
これが私のコードです。いくつかのコンテキストではExecutor#execute(Runnable)
、2 つのスレッドを作成するために使用しています。私はまだスレッドと並行性について学んでおり、ネットワークとそれらをつなぎ合わせようとしているので、それに関するフィードバックも大歓迎です!!
ServerSocketManager ServerDataManager
どうもありがとう、私はこれが理解するのにかなりのものであることを知っているので、読んで返信するために時間を割いてくれてありがとう!!