SocketChannel - write 不写所有的 DATA
Posted
技术标签:
【中文标题】SocketChannel - write 不写所有的 DATA【英文标题】:SocketChannel - write does not write all the DATA 【发布时间】:2014-07-21 07:23:16 【问题描述】:我正在尝试通过 SocketChannel 发送数据(400016 字节)。 由于某种原因,并非所有数据都被发送。 (我希望看到所有 400016 字节都将被发送)
代码如下: public boolean send(byte[] bytesPayload, int nSize)
System.out.print("\nNeed to send message of size: " + nSize);
m_sendBuf.clear();
m_sendBuf.put(bytesPayload);
m_sendBuf.flip();
try
int nNumOfSentBytes = 0;
int nTotalNumOfSentBytes = 0;
while(nTotalNumOfSentBytes < nSize)
System.out.print("\nBefore write oper: pos:" + m_sendBuf.position() + " limit: " + m_sendBuf.limit() + " remainging: " + m_sendBuf.remaining() + " has remaining: " + m_sendBuf.hasRemaining());
nNumOfSentBytes += m_socketChannel.write(m_sendBuf);
System.out.print("\nAfter write oper: pos:" + m_sendBuf.position() + " limit: " + m_sendBuf.limit() + " remainging: " + m_sendBuf.remaining() + " has remaining: " + m_sendBuf.hasRemaining());
nTotalNumOfSentBytes += nNumOfSentBytes;
System.out.print("\nsent " + nNumOfSentBytes + " bytes");
catch (IOException e)
System.out.print("\n" + e);
return false;
System.out.print("\nFinish sending data");
return true;
我正在调用 byte[] 为 400016 的函数。
我收到以下打印件: 需要发送大小的消息:400016 写前操作:pos:0 限制:400016 剩余:400016 有剩余:真 写入操作后:pos:262142 限制:400016 剩余:137874 已剩余:true 发送 262142 字节 写前操作:pos:262142 限制:400016 剩余:137874 有剩余:true 写入操作后:pos:262142 限制:400016 剩余:137874 已剩余:true 发送 262142 字节 完成发送数据
【问题讨论】:
【参考方案1】:这就是问题所在:
nNumOfSentBytes += m_socketChannel.write(m_sendBuf);
nTotalNumOfSentBytes += nNumOfSentBytes;
您似乎无法确定 nNumOfSentBytes
的含义 - 在第一行,您似乎实际上将其视为发送的 total 字节数(因为您是将其增加您刚刚发送的字节数),但是在第二行您将其视为您刚刚发送的字节数,以增加另一个总数。
老实说,目前还不清楚为什么你会同时拥有这两个变量。我怀疑你只需要一个:
int bytesSent = 0;
while (bytesSent < size)
bytesSent += m_socketChannel.write(m_sendBuf);
// Add whatever diagnostics you need
【讨论】:
嗨,谢谢。您将如何在接收器处编写代码?我会得到 400016 字节?或更多字节? (如果更多,我如何从中构建消息?)以上是关于SocketChannel - write 不写所有的 DATA的主要内容,如果未能解决你的问题,请参考以下文章
NIO-SocketChannel.configureBlocking(false)作用