私は単純なネットワーククライアントを作ろうとしています。クライアントはキュー(バッファ)に書き込むことができ、2番目のスレッドはこのバッファを取り、それをサーバに書き込む必要があります。バッファにチャネルが書き込まれている間にバッファを書き込もうとしています
java.nio
で試したところ、ByteBuffer
のThread
が作成されました。このByteBuffer
は、チャネルに書き込むためにThread
のwhile(true)
で使用されています。私はput()
メソッドを使用して静的なバッファにいくつかのバイトを入れているいくつかの点で私のメインループでは
。デバッグモードで
Iは、チャネル書き込みスレッドを中断した後、私は(バッファに書き込むだけ押し込ま「A」)私のメインプログラムループを介してバッファを充填しました。
3回または4回ボタンを押した後、再びチャンネル書き込みスレッドを開始し、うまくいきました。
しかし、私は、メインループスレッドにバッファオーバーフローのエラーを取得していますプログラムは普通してみてください。私のプログラムはバッファが私のchannel-writing-threadによってアクセスされている間にバッファにデータを入れようとしていると思う。私は両方のスレッドの両方の部分でsynchronizedキーワードを使用しようとしましたが、それは役に立たなかった。
メインループ:
class PacketReader implements Runnable
{
public static ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
[...]
public void run()
{
while (true) {
[...]
if (selKey.isValid() && selKey.isWritable())
{
SocketChannel sChannel = (SocketChannel)selKey.channel();
//synchronized (PacketReader.writeBuffer)
//{
if(PacketReader.writeBuffer.hasRemaining())
{
PacketReader.writeBuffer.flip();
int numBytesWritten = sChannel.write(PacketReader.writeBuffer);
PacketReader.writeBuffer.flip();
}
//}
}
[...]
任意のアイデアはどのようなバッファリングのライトシステムを作成するには: "PacketReader"(まあ、それは実際に読み書きです)という名前の
[...]
if(Gdx.app.getInput().isKeyPressed(Input.Keys.A) && (now.getTime() - lastPush.getTime()) > 1000)
{
lastPush = now;
//synchronized (PacketReader.writeBuffer)
//{
PacketReader.writeBuffer.put(("KeKe").getBytes());
//}
}
[...]
マイスレッド?私はそれが一般的な問題だと思うが、私は何を検索するのか分からない。すべてのNIOチュートリアルでは、バッファがチャンネルループ内に埋め込まれていると思われるようです。
最後に、ネットワークコンポーネントが一度起動し、プログラム内でプログラムを作成しようとしていますが、キューの処理やキューを待たずにパケットを送信する静的送信メソッドを使用したかっただけです。
おそらくどこかにチュートリアルがありますか?への直接の答えではないほとんどのゲームは、同様の概念を使用する必要がありますが、私はNIO実装と任意のオープンソースのシンプルなJavaのゲームを見つけることができませんでした(私はフレームワークなしでそれをしようとしているので、私はアンドロイドのためにそれを使用します)
この度はありがとうございます。私はKryonetやPyronetのようなlightwightフレームワークについて考えてきましたが、Androidでこれを使用しているので、私は直接的なプログラミングがパフォーマンスにとってより良いと思っていました。一方、私はNIOを学びたかったので、なぜ自分自身を拷問しないのですか? :D –