在写入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个周期),这对我的客户来说确实是一个问题。
我真的不知道出了什么问题。数据似乎是由客户端发送的,但它永远不会到达服务器端。我也用代理检查了它。
我会非常感谢任何想法和提示。
P.S。也许它扮演了一些角色:客户端代码运行在移动的Android移动设备上(它在汽车中)。通过GPRS建立互联网连接。