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的主要内容,如果未能解决你的问题,请参考以下文章

Boost:asio 套接字读/写所花费的时间

NIO-SocketChannel.configureBlocking(false)作用

在turtle.write()函数在turtle窗口中不写。

我的生物系学妹也能听懂的Java NIO中Write事件

SocketChannel

Java NIO系列教程 SocketChannel