java网络通信之非阻塞通信
java中提供的非阻塞类主要包含在java.nio,包括:
1、ServerSocketChannel:ServerSocket替代类,支持阻塞与非阻塞;
2、SocketChannel:Socket的替代类,支持阻塞与非阻塞;
3、Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读和写事件;
4、SelctionKey:代表ServerSocketChannel及SocketChannel向Selector注册事件,当一个SelectionLKey对象位于Selector的selected-keys集合中时,就表示与这个SelectionKey相关的事件发生。
以上中,SocketChannel以及ServerSocketChannel均是SelectableChannel类的子类,而这个类又继承了Channel接口。
SelectableChannel类向Selector类注册来监控前者可能发生的事件,过程为:SelectionKey key = serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT)。
SocketChannel中发送和接收数据的方法为:
1、read(ByteBuffer buffer):将接收到的数据存放在指定的buffer中;
2、write(ButeBuffer buffer):将buffer中的数据发送出去。
Buffer(抽象类,位于java.nio包):
Buffer的属性:
1、容量,表示缓冲区可以保存的数据数量;
2、极限,表示换从去的当前终点,不能对超过缓冲区极限的区域进行读写,说白了就是极限之前的数据是有效的,之后的无效,不能大于容量;
3、位置,表示缓冲区下一个读写单元的位置,每次读写时会改变这个数值,不能大于极限;
缓冲区改变三个属性的方法:
1、clear(),极限设置为容量,位置置为0;
2、flip(),把极限设置为位置,再把位置置为0;
3、rewind(),不改变极限,把位置置为0。
Buffer有很多子类:
1、ByteBuffer,没有构造方法,需要静态类:
1)、allocate(int capacity),返回ByteBuffer类对象,capacity指定缓冲区的大小;
2)、directAllocate(int capacity),同上,I/O操作速度快,但是系统开销大。
2、除boolean之外的其它基本类型都有buffer类,都有allocate(int capacity)静态方法返回实例;
3、MappedByteBuffer,ButeBuffer类的子类,把缓冲区和文件某个区域直接映射。
读写缓冲区的方法如下:
1、get(),冲缓冲区当前位置读取一个单元数据,读完后把位置加1;
2、get(int index),绝对读,从index位置读数据但不改位置;
3、put(),向缓冲区当前位置写一个数据,然后位置加1;
4、put(int index),绝对写,向index位置写数剧单不改位置。
字符编码Charset(java.nio)
该类实例代表特定的字符编码类型,其编码与解码的方法如下:
1、ByteBuffer encode(String str),将字符串str转换为Byte并保存在ByteBuffer中;
2、ByteBuffer encode(CharBuffer cb),同上;
3、CharBuffer decode(ByteBuffer b),将b转换为CharBuffer;
Charset类中有静态方法forName(String encode)返回Charset对象,参数指定编码类型;还有一个defaultCharset()返回本平台默认字符编码的Charset对象。
Channel(java.nio.channels)接口用于连接缓冲区与数据源或者数据目的地,数据源的数据经过通道到达缓冲区,然后缓冲区的数据再经过通道到达目的地,其中包括两个方法:
1、close(),关闭通道;
2、isOpen(),判断通道是否打开。
Channel的子接口很多:
1、ReadableByeChannel接口,声明read(ByteBuffer dst),把数据源的数据读入到ByteBuffer;
2、WriteByteChannel接口,声明write(ByteBuffer src),将ByteBuffer中的数据写入到目的地。
3、ScatterByteChannel接口,分散读取数据,单个读取操作能填充多个缓冲区,它提供了read(ByteBuffer[] src),将读取的数据依次填充到ByteBuffer各个元素中;
4、GatheringByteChannel接口,集中写入数据,声明了write(ByteBuffer[] scrs),将各个ByteBuffer写入到指定的目的地;
5、FileChannel类,实现了ByteChannel、ScatteringByteChannel和GatherByteChannel,不能new,只能通过FileInputStream、FileOutputStrem、RandomAccessFile的getChannel()返回相应的FileChannel。
6、SelectableChannel,支持阻塞和非阻塞的I/O,其方法包括:
1)、public SelectableChannel configureBlocking(boolean block) throws IOException,block为false时,表示为把SelectableChannel设置为非阻塞模式;
2)、isBlocking()判断SelectableChannel是否为阻塞模式;
3)、public SelectionKey register(Selector sel, int ops) throws ClosedChannelException;
4)、public SelectionKey register(Selector sel,int ops,Object attachment) throws ClosedChannelException,这两个方法均向Selector注册事件,其中Object为SelectionKey关联的一个附件。
java网络通信之非阻塞通信的更多相关文章
- Java NIO Socket 非阻塞通信
相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...
- 用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...
- java并发之非阻塞算法介绍
在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的. 为了更好的理解阻塞算 ...
- 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...
- 利用Python中SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信 版权声明 本文转自:http://blog.csdn.net/cnmilan/article/details/9664823 ...
- UE4 Socket多线程非阻塞通信
转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...
- 【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类 ...
- java nio实现非阻塞Socket通信实例
服务器 package com.java.xiong.Net17; import java.io.IOException; import java.net.InetSocketAddress; imp ...
- Python—网络通信编程之tcp非阻塞通信(socketserver)
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
随机推荐
- runtime基础
前言 学习Objective-C的运行时Runtime系统是很有必要的.个人觉得,得之可得天下,失之则失天下. Objective-C提供了编译运行时,只要有可能,它都可以动态地运作.这意味着不仅需要 ...
- HALF<水题>
题意: 找出n/d=0.5的所有数.输入:test,x(代表n的位数,1<=x<=4).并且n和d的每一个位数不能有重复,也不能是0. 输入: 1 1 输出: the form 1/2 = ...
- nagios安装全过程
Nagios是一个用来监控主机.服务和网络的开放源码软件,可以在发生故障时发送报警短信和邮件,只要Nagios监控的对象发生故障,系统就会自动发送短信到手机上.所以应用十分广泛. Nagios is ...
- HDU 3265 Posters ——(线段树+扫描线)
第一次做扫描线,然后使我对线段树的理解发生了动摇= =..这个pushup写的有点神奇.代码如下: #include <stdio.h> #include <algorithm> ...
- 优化のzencart URL &zenid=.....
zencart URL后面带有一串&zenid=.....解决方案 发布时间:2013年3月16日 次浏览:106 经木木测试,此方法可用. ================= 最近一个客户的 ...
- Django: 之Model、Cookis、Session
到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用MySQLdb来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 im ...
- JSON缺包导致的错误
Json-lib 需要的 jar 包 commons-beanutils-1.8.3.jar commons-collections-3.2.1.jar commons-lang-2.6.jar co ...
- Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务
本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕. l 增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下: ...
- 关于tomcat启动没有进行编译或者编译报错的问题
关于tomcat 的问题 如果项目没有编译 解决方案:1: 把项目刷新一下 然后Clean一下,之后等待右下角编译完成100%2: 有可能tomcat conf 里的配置文件的错误 进入查看下3: 如 ...
- typescript中的工具 tsd
首先帮微软买个广告:VSCode 实在是太适合我了,感觉写起来无比舒畅,建议有兴趣的可以去试试用vsCode写前端. 最近开始使用ts去构建项目,感觉写起来非常的爽(本人以前接触过c#和java),终 ...