【问题标题】:socketchannel.write has a limit? [duplicate]socketchannel.write 有限制吗? [复制]
【发布时间】: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。

标签: java tcp server nio


【解决方案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的缓冲区,满了就刷新

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

【讨论】:

  • 不,你不应该。您应该阅读教程,以及关于同一主题的大约一百个答案。当write() 返回零时,您应该选择 OP_WRITE 以告诉您通道何时可写,而不是像这样盲目地旋转。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多