Java NIO写入异常问题

在使用NIO进行写入数据时,我把缓冲区增大1000k,为什么这时会出现没有写完的情况??

public class Server {

  public static void main(String[] args) throws Exception {
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.configureBlocking(false);
    serverSocketChannel.bind(new InetSocketAddress("localhost", 7077));

    Selector selector = Selector.open();
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    selector.select();
    Set<SelectionKey> selectedKeysSet = selector.selectedKeys();
    Iterator<SelectionKey> iterator = selectedKeysSet.iterator();
    while (iterator.hasNext()) {
      SelectionKey key = iterator.next();
      SocketChannel socketChannel = ((ServerSocketChannel) key.channel()).accept();
      socketChannel.configureBlocking(false);
      ByteBuffer byteBuffer = ByteBuffer.allocate(1000 * 1024);
      System.out.println("byteBuffer.limit()=" + byteBuffer.limit());
      socketChannel.write(byteBuffer);
      System.out.println("byteBuffer.position()=" + byteBuffer.position());
      socketChannel.close();
    }
    serverSocketChannel.close();
  }
}
public class Client {

  public static void main(String[] args) throws Exception {
    SocketChannel channel1 = SocketChannel.open();
    channel1.connect(new InetSocketAddress("localhost", 7077));
    TimeUnit.MINUTES.sleep(1);
    channel1.close();
  }
}
byteBuffer.limit()=1024000

byteBuffer.position()=261676

阅读 1.9k
2 个回答

猜测是你设置的不准确,按照你的代码,我做了测试:

while (iterator.hasNext()) {
    SelectionKey key = iterator.next();
    SocketChannel socketChannel = ((ServerSocketChannel) key.channel()).accept();
    //设置缓冲区大小
    socketChannel.setOption(StandardSocketOptions.SO_SNDBUF,1000 * 1024);
    
    System.out.println(socketChannel.getOption(StandardSocketOptions.SO_SNDBUF));
    socketChannel.configureBlocking(false);
    ByteBuffer byteBuffer = ByteBuffer.allocate(1000 * 1024);
    System.out.println("byteBuffer.limit()=" + byteBuffer.limit());
    System.out.println(socketChannel.write(byteBuffer));
    System.out.println("byteBuffer.position()=" + byteBuffer.position());
    socketChannel.close();
}

//输出
1024000
byteBuffer.limit()=1024000
1024000
byteBuffer.position()=1024000

没有规定必须一次就把全部数据写完吧,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题