gpt4 book ai didi

java - SocketChannel - 写入不会写入所有数据

转载 作者:行者123 更新时间:2023-12-01 12:55:08 28 4
gpt4 key购买 nike

我正在尝试通过 SocketChannel 发送数据(400016 字节)。由于某种原因,并未发送所有数据。 (我希望看到所有 400016 字节都将被发送)

代码如下:公共(public) boolean 发送(字节[] 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;

}

我正在使用 400016 的 byte[] 调用该函数。

我收到以下打印结果:需要发送消息大小:400016写入操作前: pos:0 限制:400016 剩余:400016 已剩余:true写入操作后:pos:262142限制:400016剩余:137874有剩余:true已发送 262142 字节写操作之前:pos:262142限制:400016剩余:137874有剩余:true写入操作后:pos:262142限制:400016剩余:137874有剩余:true已发送 262142 字节完成发送数据

最佳答案

这就是问题:

nNumOfSentBytes += m_socketChannel.write(m_sendBuf);
nTotalNumOfSentBytes += nNumOfSentBytes;

您似乎无法确定 nNumOfSentBytes 的含义 - 在第一行中,您实际上将其视为发送的字节数总数 (因为您要根据刚刚发送的字节数来增加它),但是在第二行,您将其视为您刚刚发送的字节数,以增加另一个总数。

说实话,根本不清楚为什么你有这两个变量。我怀疑你只需要一个:

int bytesSent = 0;
while (bytesSent < size) {
bytesSent += m_socketChannel.write(m_sendBuf);
// Add whatever diagnostics you need
}

关于java - SocketChannel - 写入不会写入所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973135/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com