我正在编写一个nio服务器,处理一些http请求
我想使用SocketChannel的方法write(ByteBuffer[] srcs)
,
像这样的代码
@Override
public void send(ByteBuffer[] arr) throws IOException {
long writeBytes=channel.write(arr);
log.debug("writeBytes "+writeBytes);
}
但如果arr
太大,例如93k,则只能写
DEBUG : 2017-08-25 15:03:41 > writeBytes16384
在浏览器中,当然它并不完整,只是其中的一部分
如果我拆分它,例如
@Override
public void send(byte[] bytes, int index, int length) throws IOException {
ByteBuffer buffer=ByteBuffer.allocate(1024);
try {
buffer.put(bytes,index,length);
}catch (BufferOverflowException e){
log.error(e.getMessage());
}
buffer.flip();
channel.write(buffer);
}
并在每个方法后使用Thread.sleep(2)
,并在循环中发送93次,没关系,但我不认为这是一个好方法
16384是16k,我真的觉得有些缓冲区是16k,但我没找到哪个缓冲区是
我看到channel.socket().getSendBufferSize();
是8192
我尝试channel.socket().setSendBufferSize(4*1024*1024);
但它无效
如何成功将大数据(超过16k)传输到一次并且不睡觉或等待
答案 0 :(得分:-1)
谢谢@Keyaman
你是对的,我应该阅读一些教程
我修好了,效果很好
while(arr[arr.length-1].hasRemaining()){
long writeBytes=channel.write(arr);
log.debug("writeBytes "+writeBytes);
}
但我仍然不是一个好方法
它就像这样记录
DEBUG : 2017-08-25 16:26:56 > writeBytes 16384
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
...
DEBUG : 2017-08-25 16:26:56 > writeBytes 16384
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
...
DEBUG : 2017-08-25 16:26:56 > writeBytes 0
DEBUG : 2017-08-25 16:26:56 > writeBytes 12922
缓冲区应该是16k,当它已满时,它会刷新
它是什么,我可以设置吗?