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 経由で確立されます。