zoukankan      html  css  js  c++  java
  • 九、Java NIO SocketChannel

    所有文章

    https://www.cnblogs.com/lay2017/p/12901123.html

    正文

    SocketChannel表示一个连接到TCP通道的Socket上。有两种方式可以创建SocketChannel

    1.你可以直接open一个SocketChannel,然后connect

    2.当ServerSocketChannel接收到连接的时候

    open一个SocketChannel

    SocketChannel socketChannel = SocketChannel.open();
    socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

    close一个SocketChannel

    socketChannel.close(); 

    从SocketChannel读取数据

    ByteBuffer buf = ByteBuffer.allocate(48);
    
    int bytesRead = socketChannel.read(buf);

    写入数据到SocketChannel

    String newData = "New String to write to file..." + System.currentTimeMillis();
    
    ByteBuffer buf = ByteBuffer.allocate(48);
    buf.clear();
    buf.put(newData.getBytes());
    
    buf.flip();
    
    while(buf.hasRemaining()) {
        channel.write(buf);
    }

    非阻塞模式

    你可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,connect、read、write操作都变成了异步

    connect

    非阻塞模式下,connect方法变成异步。你需要主动去判断连接是否完成

    socketChannel.configureBlocking(false);
    socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
    
    while(! socketChannel.finishConnect() ){
        //wait, or do something else...    
    }

    write

    非阻塞模式下,write方法直接返回。因此,你需要在循环中不断调用write方法。但是在上面的write示例中本身就是循环调用,所以其实写法没有不同

    read

    非阻塞模式下,read方法直接返回,这时候可能并未读取到任何数据。因此,你需要注意read方法返回值,从而判断当前有没有读取到数据。

    非阻塞模式下的选择器

    非阻塞模式的SocketChannel和Selector搭配使用非常方便。通过将SocketChannel注册到Selector中,当SocketChannel可用的时候通过事件响应异步处理

  • 相关阅读:
    Huffman树与编码
    Python引用复制,参数传递,弱引用与垃圾回收
    Git使用说明
    numpy使用指南
    Python Socket
    温故知新之 数据库的事务、隔离级别、锁
    Oracle数据库的语句级读一致性
    VirtualBox NAT方式与主机互相通信
    Linux的定时任务
    Redis学习
  • 原文地址:https://www.cnblogs.com/lay2017/p/12906661.html
Copyright © 2011-2022 走看看