一.SelectableChannel

  1. SelectableChannel支持阻塞和非阻塞模式的channel

    非阻塞模式下的SelectableChannel,读写不会阻塞
  2. SelectableChannel可以向Selector注册监听就绪读和就绪写时间,当Selector发现这些时间触发,就会通知SelectableChannel进行读写
  3. 主要函数
    (1)public SelectableChannel configureBlocking(boolean block):If false then it will be placed non-blocking mode
    (2)public SelectionKey register(Selector sel, int ops, Object att):

二.ServerSocketChannel

  1. ServerSocketChannel是ServerSocket的替代类,每个ServerSocketChannel对象对应一个ServerSocket对象,无构造方法。
  2. ServerSocketChannel是SelectableChannel的子类
    (1)public static ServerSocketChannel open()   // 返回ServerSocketChannel对象,该对象未与任何端口绑定,且处于阻塞模式
    (2)serverSocketChannel.socket().bind(int port) // 把ServerSocketChannel绑定到指定端口
    (3)public final int validOps() // 返回channel支持的事件,return SelectionKey.OP_ACCEPT;

三.SocketChannel

  1. SocketChannel是SelectableChannel和ByteChannel的子类
    (1)public static SocketChannel open()
    (2)public SelectableChannel configureBlocking(boolean block)
    // 返回channel支持的事件,returnreturn(SelectionKey.OP_READ|SelectionKey.OP_WRITE|SelectionKey.OP_CONNECT);
    (3)public final int validOps()
    (4)public abstract boolean isConnectionPending(); //查看该channel上是否有连接
    /**将字节序列从此通道中读入给定的缓冲区。
    设dst的剩余容量limit-position为r,阻塞模式下的读方法,会尝试读到dst的limit位置或读到输入流末尾或发生异常,否则一直阻塞
    非阻塞模式下,能读多少度多少,立即返回,不会尝试读满dst再返回
    read()方法返回实际上读入的字节数,可能为0,可能为-1,若为-1,表示读到了输入流末尾
    */
    (5)public int read(ByteBuffer dst)
    /**将src的内容写到channel中,设src的有内容的部分limit-position为r个字节,阻塞模式下,write方法会把r个字节全部写出才能返回,否则阻塞
    非阻塞模式下的write():能输出多少输出多少,可能输出不到r个字节,或输出了0个字节。非阻塞模式下write方法立即返回
    */
    (6)public int write(ByteBuffer src)
    }

四.Selector

  1. 一旦ServerSocketChannel和SocketChannel向Selector注册了事件,Selector会监控这些事件是否发生,Selector包含3种SelectionKey集合

    (1)all-keys集合:Selector监听的所有Selectionkey集合,Selector的keys()方法

    (2)selected-keys集合:返回已经被Selector捕获的SelectionKey集合,Selector的selectedKeys()

    (3)cancelled-keys集合:已经被取消的SelectionKey集合,没有方法获取
  2. 当SelectableChannel的register(Selector sel, int ops)方法触发,会新建一个SelectionKey,并把它加入到all-keys集合。如果关闭了与SelectionKey关联的SelectableChannel对象,或执行了SelectionKey的cancel()方法,则把该key加入到cancelled-keys集合,表示该key对象已经失效,在下次执行Selector的select()方法时,被取消的key对象从所有集合删除。
  3. 当执行Selector的select()方法时,若与Selectionkey对象相关的事件发生了,则该key对象就加入到了selected-keys集合。程序直接调用selected-keys集合的remove()方法,或调用它的iterator的remove(),都能从selected-keys集合中删除这个key对象,但不允许调用集合接口的remove()方法从all-keys中删除key对象,否则跑出UnsopportException
(1)public static Selector open()    //Opens a selector
(2)public Set<SelectionKey> keys() //返回Selector的all-keys集合(UnmodifiableSet)
(3)public int selectNow() //返回相关事件已发生的SelectionKey对象数目,采用非阻塞方式,如果没有就返回0
/**采用阻塞方式,返回已发生的Selectionkey个数,如果一个也没有,就进入阻塞模式,除非其他线程调用了selector.wakeup()*/
(4)public int select()

TCP非阻塞通信的更多相关文章

  1. Python—网络通信编程之tcp非阻塞通信(socketserver)

    服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...

  2. 利用Python中SocketServer 实现客户端与服务器间非阻塞通信

    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...

  3. 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信

    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...

  4. 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计

    这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...

  5. Java NIO Socket 非阻塞通信

    相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...

  6. 用Java实现非阻塞通信

    用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...

  7. UE4 Socket多线程非阻塞通信

    转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...

  8. 34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本

    TCP非阻塞及套接字异常处理: TCP阻塞套接字异常捕获: 套接字创建失败,8000 socket.error 客户端连接错误: ConnectionRefusedError socket.gaier ...

  9. 基于MFC的socket编程(异步非阻塞通信)

       对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...

随机推荐

  1. ZOJ 1110 Dick and Jane

    原题链接 题目大意:Dick和Jane的年龄之和等于他们宠物的年龄,宠物之间的年龄关系XXX. 解法:小学奥数题目,枚举法. 参考代码: #include<iostream> #inclu ...

  2. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  3. URAL 2030 Awesome Backup System

    Awesome Backup System Time limit: 2.0 secondMemory limit: 64 MB It is known that all people can be d ...

  4. js 获取地址栏参数

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  5. kuangbin_ShortPath H (POJ 3660)

    本来想自己写个bfs让他顺着胜负边爬 走到拐弯处就判定无法确定次序 然后我发现有多余的边并不会自己省略掉 要写个O(n^3)的删掉多余边这都不如Floyd了 看奚政学长写的是拓扑序也能解 然后在理解看 ...

  6. mave之:java的web项目必须要的三个jar的pom形式

    jsp-api javax.servlet-api jstl <!-- jsp --> <dependency> <groupId>javax.servlet< ...

  7. COM ,Threading Models,apartments,RPC

    Component Object Model (COM) https://msdn.microsoft.com/en-us/library/windows/desktop/ms680573%28v=v ...

  8. java_linear list

    1.线性表的顺序存储结构,类似ArrayList package collectionsFramework.linearlist; import java.util.Arrays; /** * @Pa ...

  9. Expect安装方法

    Expect安装方法 http://bluethink.iteye.com/blog/1079044 Tcl脚本SSHITeyeUnix  Expect是基于Tcl语言的一种脚本语言,其实无论是交互还 ...

  10. syslog-ng 安装

    下载 Syslog-NG的rpm包,  地址 http://www.kevindeng.org/wp-content/uploads/2010/10/Syslog-NG.zip unzip解压 [ro ...