1

NIO ソケットへの書き込み中に非常に奇妙な動作をします。私のモバイル クライアントでは、次のように構成された NIO socketChannel を使用しています。

InetSocketAddress address = new InetSocketAddress(host, port);
socketChannel = SocketChannel.open();
socketChannel.socket().connect(address, 10000); 
socketChannel.configureBlocking(false);

次に、定期的に (60 秒ごとに) この socketChannel にデータを書き込みます (ここのコードは少し簡略化されています)。

ByteBuffer readBuffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);

readBuffer.clear();

int numRead = -1;
numRead = socketChannel.read(readBuffer);
Log.write("Read " + numRead + " bytes" );


if(numRead > 0)
{
    processServerResponse(readBuffer);
}
else if(numRead < 0)
{
    // ... re-connect etc.
}

// ...
byte[] msg = getNextMessage();

ByteBuffer buffer = ByteBuffer.wrap(msg);
int numOfBytes = 0;
while(buffer.hasRemaining())
{
    numOfBytes += socketChannel.write(buffer);
}

Log.write("Written " + numOfBytes + " bytes of " + msg.length );

そして、それは機能します。しかし... ときどき (ごくまれに、1 日に 1 ~ 2 回) サーバーがデータを受信しません。クライアント ログは次のようになります。

Written 10 bytes of 10 
Written 20 bytes of 20 
Written 30 bytes of 30 
Written 40 bytes of 40 
Written 50 bytes of 50 

等々。しかし、サーバー側では次のようになります。

Received 10 bytes of 10 
Received 50 bytes of 50 

クライアント側ではすべてのデータが例外なく送信されたように見えるにもかかわらず、20、30、および 40 バイトのデータ レコードは受信されませんでした。(実際には、サーバーログはこの簡略化されたバージョンよりも少し優れています。したがって、どのデータが送信されたかを確認できます (送信されたレコードにはタイムスタンプなどが含まれています))

このようなギャップは小さい場合もあり (2 ~ 3 分)、それほど悪くはありませんが、場合によっては非常に大きくなる場合があり (1 ~ 2 時間 = 60 ~ 120 サイクル)、これは私の顧客にとって本当に問題です。

何が間違っているのか本当にわかりません。データはクライアントから送信されたように見えますが、サーバー側には届きません。プロキシでも確認しました。

アイデアやヒントをいただければ幸いです。

PS おそらく何らかの役割を果たします。クライアント コードは、移動中の Android モバイル デバイス上で実行されます (車内にあります)。インターネット接続は GPRS 経由で確立されます。

4

0 に答える 0