TCP非阻塞通信
一.SelectableChannel
- SelectableChannel支持阻塞和非阻塞模式的channel
非阻塞模式下的SelectableChannel,读写不会阻塞 - SelectableChannel可以向Selector注册监听就绪读和就绪写时间,当Selector发现这些时间触发,就会通知SelectableChannel进行读写
- 主要函数
(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
- ServerSocketChannel是ServerSocket的替代类,每个ServerSocketChannel对象对应一个ServerSocket对象,无构造方法。
- 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
- 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
- 一旦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集合,没有方法获取 - 当SelectableChannel的register(Selector sel, int ops)方法触发,会新建一个SelectionKey,并把它加入到all-keys集合。如果关闭了与SelectionKey关联的SelectableChannel对象,或执行了SelectionKey的cancel()方法,则把该key加入到cancelled-keys集合,表示该key对象已经失效,在下次执行Selector的select()方法时,被取消的key对象从所有集合删除。
- 当执行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非阻塞通信的更多相关文章
- Python—网络通信编程之tcp非阻塞通信(socketserver)
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
- 利用Python中SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...
- 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...
- 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...
- Java NIO Socket 非阻塞通信
相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...
- 用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...
- UE4 Socket多线程非阻塞通信
转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...
- 34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本
TCP非阻塞及套接字异常处理: TCP阻塞套接字异常捕获: 套接字创建失败,8000 socket.error 客户端连接错误: ConnectionRefusedError socket.gaier ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...
随机推荐
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- Android—常用组件练习
新建一个文件“practice1.xml” 编写代码如下: <?xml version="1.0" encoding="utf-8"?> <L ...
- hdu2647 拓扑序
题意:年终要给 n 个员工发奖金,每个人的起始金额是888,有些人觉得自己做的比另一个人好所以应该多得一些钱,问最少需要花多少钱,如果不能满足所有员工的要求,输出 -1 拓扑排序,从奖金少的向奖金多的 ...
- 【NOIP2010】引水入城
以前一直以为是什么高端DP,看了题解才发现是水题,老是这样看题解才能写出来到赛场上怎么办嘛QAQ 原题: 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好 ...
- Python 基本语法1
Python 基础语法(一) Python的特点 1. 简单 Python是一种代表简单思想的语言. 2. 易学 Python有极其简单的语法. 3. 免费.开源 Python是FLOSS(自由/开放 ...
- 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia
SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...
- syslog syslog-ng rsyslog flume scribe 各种尝试
1. syslog概念 syslog本身是一种协议, 一个用来描述系统日志格式的协议, 当前的协议包括三部分: 如下面是一个syslog消息: <30>Oct 9 22:33:20 hlf ...
- ABBYY FineReader 12扫描界面介绍
ABBYY FineReader 12OCR图文识别软件自身拥有着自己的扫描界面,一般在默认情况下,ABBYY FineReader 使用其自身的扫描界面.本文就解析了ABBYY FineReader ...
- JQuery高性能最佳实践
[使用最佳选择器] 使用JQuery时,你可以使用多种选择器,选择同一个元素,各种方法之间的性能是不一样的,有时候差异会特别大. 通常比较常用的选择器有以下几个: ID选择器 $("#id& ...
- unity,standalone下自定义分辨率不起作用的解法
写一个Editor脚本AddMenu.cs:using UnityEditor; using UnityEngine; public class AddMenu : EditorWindow { [M ...