【发布时间】:2018-02-03 05:16:57
【问题描述】:
我正在写一个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)传输到浏览器而不休眠或等待
【问题讨论】:
-
这就是使用非阻塞 IO 时的全部想法。我认为您需要阅读一个好的教程,因为目前您还很遥远。或者切换到阻塞 IO。