gpt4 book ai didi

java - SocketChannel.write(buffer) 阻塞并且写入零字节

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:14 24 4
gpt4 key购买 nike

当我们使用套接字 channel 写入方法写入数据时。小字节数据花费太多时间。例如,如果许多客户端连接到我的应用程序,则写入 16249 字节数据需要 43950 毫秒。尝试写入上述数据442次。

public static void writeBytesFixedLength(SocketChannel sChannel, String msg){       
ByteBuffer writeBuffer = ByteBuffer.allocate(msg.length()*2);
writeBuffer.put(msg.getBytes());
writeBuffer.flip();
long nbytes = 0;
long toWrite = writeBuffer.remaining();
int sleepCount = 0;
int loopCount = 0;
int sleepTime = 50;
int sumSleepCount = 0;
int sumSleepTime = 0;
try
{
int count = 0;
while (nbytes != toWrite) {
count= sChannel.write(writeBuffer);
nbytes +=count;
loopCount += 1;
try {

if(count == 0){
OSUsage();
MainImapServer.printThreadStatus();
sleepCount += 1;
sumSleepCount += 1;
if(sleepCount == 4){
sleepTime = 50;
sleepCount =1;
}
sumSleepTime += sleepTime*sleepCount;
Thread.sleep(sleepTime*sleepCount);

}
}
catch (InterruptedException e) {}
}
}
catch (ClosedChannelException cce) {}
catch (Exception e) {}

if(sumSleepCount >3)
logger.info("Send buffer is full: Total Byte: "+ toWrite+ " sleepCount: "+sumSleepCount +" sleepTime: "+sumSleepTime+ " loopCount: "+ loopCount);
}

请提供一些解决此问题的建议

提前致谢

最佳答案

您在这里断言您的套接字 channel write() 调用正在阻塞并且返回零。这些说法相互矛盾。你误会了。 API 规范和底层机制都使这成为不可能。 要么它阻塞或者它返回零。

编辑 从您的代码看来,它返回零。这意味着几件事:

  1. 没有阻塞。
  2. 您的 channel 处于非屏蔽模式。
  3. 您的书写速度比接收者的阅读速度快。

当您得到零时,您应该使用OP_WRITE的Selector注册 channel ,调用select(),并在 channel 变为可写时重试写入;如果写入成功,则取消注册 OP_WRITE。这些 sleep() 都不是废话。

显然您需要阅读 Oracle NIO 教程。或者全部扔掉并使用阻塞模式。 java.net 甚至。简单多了。

关于java - SocketChannel.write(buffer) 阻塞并且写入零字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35474225/

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