美文网首页
Android非阻塞Socket

Android非阻塞Socket

作者: YourChoice | 来源:发表于2020-12-02 17:08 被阅读0次

一、NIO中有关非阻塞Socket的类:

1、ServerSocketChannel类:

服务器套接字通道相当于传统IO下的ServerSocket,通过ServerSocketChannel的socket()可以获得传统的ServerSocket,反过来使用ServerSocket的getChannel()可以获得ServerSocketChannel对象;实例化ServerSocketChannel可以直接通过ServerSocketChannel的静态方法open()就可以了。

2、SocketChannel类:

套接字通道相当于传统IO下的Socket,通过SocketChannel的socket()可以获得传统的Socket,反过来使用Socket的getChannel()可以获得SocketChannel对象;

3、Selector类:

在NIO中注册各种事件的方法主要使用Selector(选择器)来实现的,我们可以使用Selector类的静态方法open()来实例化。

4、SelectionKey类:

SelectionKey是个选择键,在NIO中选择器和选择键是很重要的,SelectionKey描述了NIO中比较重要的事件,如OP_ACCEPT、OP_READ、OP_WRITE。

二、非阻塞和阻塞模式的区别:

服务器监听客户端连接的时候,如果没有客户连接,程序还继续执行,不会停在这里等待客户连接;或者客户连接上了,下一步就是等待客户发数据,如果不发,程序不会停留在这里,而是继续执行。反过来停留在这里,不继续执行就是阻塞。

三、非阻塞模式的实现:

1、描述:对于客户端来说,得到SocketChannel对象后,通过调用方法configureBlocking(false)来设置这个Socket为非阻塞状态。然后在配合Selector和SelectionKey的使用来与服务器进行交互。

2、示例:

        String ip = "192.168.40.41";

        int port = 8080;

        Selector mSelector;

        try {

            SocketChannel socket = SocketChannel.open(new InetSocketAddress(ip, port));

            socket.configureBlocking(false);

            mSelector = Selector.open();

            socket.register(mSelector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

            while (true) {

                mSelector.select(0);

                Set<SelectionKey> readKeys = mSelector.selectedKeys();

                Iterator<SelectionKey> iterator = readKeys.iterator();

                while (iterator.hasNext()) {

                    SelectionKey key = iterator.next();

                    iterator.remove();

                    if (key.isReadable()) {//可读

                        //执行读操作

                    } else if (key.isWritable()) {//可写

                        //执行写操作

                    }

                }

            }

        } catch (ClosedChannelException e) {

            e.printStackTrace();

        } catch (IOException ioe) {

            ioe.printStackTrace();

        }

四、BIO/NIO/AIO的区别:

BIO:同步阻塞IO,每一个客户端连接,服务端都会对应一个处理线程,对于没有分配到处理线程的连接就会被阻塞或者拒绝。相当于是一个连接一个线程

NIO:同步非阻塞IO,基于Reactor模型,客户端和channel进行通信,channel可以进行读写操作,通过多路复用器selector来轮询注册在其上的channel,而后再进行IO操作。这样的话,在进行IO操作的时候再用一个线程去处理就可以了,也就是一个请求一个线程

AIO:异步非阻塞IO,相比NIO更进一步,完全由操作系统来完成请求的处理,然后通知服务端开启线程去进行处理,因此是一个有效请求一个线程

相关文章

网友评论

      本文标题:Android非阻塞Socket

      本文链接:https://www.haomeiwen.com/subject/ewkuwktx.html