NIO非阻塞socketChannel。另一方没有收到数据

时间:2012-10-21 22:37:30

标签: java android nio

在写入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建立互联网连接。

0 个答案:

没有答案