新しいAkkaI/ Oを使用してTcpサーバーを実装しようとしていますが、残念ながらドキュメントはまだ完成しておらず、Javaでの実装に問題があります:(。クライアントとサーバーを作成して送信することができましたクライアントからサーバーへのメッセージですが、ByteIteratorを使用して受信したバイトをどのように読み取りますか?間違ったアプローチを使用していますか?データの処理方法ではない可能性があります。
たくさんのメッセージを非常に速く送信すると、何か奇妙なことが起こります。それらはすべてbiにキューに入れられ、it.getInt()を作成した後、データがリセットされることはありません。
if (msg instanceof Tcp.Received) {
final Tcp.Received recv = (Tcp.Received) msg;
final ByteString data = recv.data();
ByteIterator bi = data.iterator();
while(bi.hasNext()) {
....
}
} else if (msg instanceof Tcp.CommandFailed) {
final Tcp.CommandFailed failed = (Tcp.CommandFailed) msg;
final Tcp.Command command = failed.cmd();
// react to failed connect, bind, write, etc.
} else if (msg instanceof Tcp.ConnectionClosed) {
final Tcp.ConnectionClosed closed = (Tcp.ConnectionClosed) msg;
if (closed.isAborted()) {
// handle close reasons like this
}
解決策:ああ!今、私は自分の間違いを理解しました。クライアントにbyteStringBuilderをキャッシュし、それをクリアするのを忘れました-_-なんてばかげているのでしょう!
Javaの実装例が必要な場合は、次のようにします。
あなたたちがそれらを取っているimの最適化を持っているなら!:)
int packetSize = 0;
if (msg instanceof Tcp.Received) {
final Tcp.Received recv = (Tcp.Received) msg;
final ByteString data = recv.data();
ByteIterator bi = data.iterator();
while (bi.hasNext()) {
packetSize = bi.getInt(ByteOrder.LITTLE_ENDIAN);
Message m = Message.fromByteIterator(bi);
getContext().parent().tell(m, null);
}
}
Message.fromByteIterator(bi)は、BIからInts、Floats、Bytes Arrays ...を取得することにより、新しいメッセージオブジェクトを初期化します。