在写入 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 或 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 建立的。