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 或 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