socketchannel.write有限制吗?

时间:2017-08-25 07:43:58

标签: java tcp server nio

我正在编写一个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)传输到一次并且不睡觉或等待

1 个答案:

答案 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,当它已满时,它会刷新

它是什么,我可以设置吗?