博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaNIO非阻塞模式
阅读量:6649 次
发布时间:2019-06-25

本文共 2616 字,大约阅读时间需要 8 分钟。

package com.java.NIO;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Date;import java.util.Iterator;import java.util.Scanner;import org.junit.Test;/** *  * @author fliay * *	一、使用NIO 完成网络通信的三个核心 *	1.通道(channel):负责链接 *		java.nio.channels.Channel 接口 *			|--SelecttableChannel *				|--SocketChannel *				|--serverSocketChannel *				|--DatagramChannel *				 *				|--Pipe.SinkChannel *				|--Pipe.SourceChannel *	2.缓冲区(Buffer):负责数据的存取 * *	3.寻则其(Selector): 是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况 * * */public class TestNoBlockingNIO {			@Test//客户端	public void client() throws IOException{		//1.获取通道		SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 1008));				//2.切换非阻塞模式		sChannel.configureBlocking(false);				//3.分配指定大小的缓冲区		ByteBuffer buf = ByteBuffer.allocate(1024);				//4.发送数据给服务器		Scanner input = new Scanner(System.in);						while(input.hasNext()){			String str = input.nextLine();			buf.put((new Date().toString()+":\n"+str).getBytes());			buf.flip();			sChannel.write(buf);			buf.clear();		}				//5.关闭通道		sChannel.close();			}		@Test //服务器	public void Server() throws IOException{		//1.获取通道		ServerSocketChannel ssChannel = ServerSocketChannel.open();				//2.切换非阻塞模式		ssChannel.configureBlocking(false);				//3.绑定连接		ssChannel.bind(new InetSocketAddress(1008));				//4.获取选择器		Selector selector = Selector.open();				//5.将通道注册到选择器上,并且指定“监听接收事件”		ssChannel.register(selector, SelectionKey.OP_ACCEPT);				//6.轮训式的获获取选择器上的以及“准备就绪”的事件		while(selector.select()>0){			//7.获取当前选择器中所有注册的“选择键(已就绪的监听事件)”			Iterator
it = selector.selectedKeys().iterator(); while(it.hasNext()){ //8.获取就绪的事件 SelectionKey sk = it.next(); //9.判断具体是什么事件准备就绪 if(sk.isAcceptable()){ //10. 若“接受就绪” ,获取客户链接 SocketChannel sChannel = ssChannel.accept(); //11. 切换非阻塞模式 sChannel.configureBlocking(false); //12. 将该通道注册到选择器上 sChannel.register(selector, SelectionKey.OP_READ); }else if(sk.isReadable()){ //13. 获取当前选择器上“读就绪”状态的通道 SocketChannel sChannel = (SocketChannel) sk.channel(); //14. 读取数据 ByteBuffer buf= ByteBuffer.allocate(1024); int len =0; while((len =sChannel.read(buf))>0){ buf.flip(); System.out.println(new String(buf.array(),0,len)); buf.clear(); } } //15. 取消选择键 SelectionKey it.remove(); } } } }

  

转载于:https://www.cnblogs.com/fliay/p/7611968.html

你可能感兴趣的文章
CloudStack4.1.1升级CloudPlatForm4.2.0实践手册
查看>>
Centos安装各种数据分析库,numpy,pandas,matplotlib,seaborn,scipy
查看>>
C#基础知识整理:C#类和结构(3)
查看>>
SharePoint Server 2010 初始化
查看>>
【我眼中的戴尔转型】(四)惠普之道,月亮的脸悄悄地在改变
查看>>
***S 2012 聚合函数 -- 指定分页示例
查看>>
直播疑难杂症排查(3)— 首开慢
查看>>
某公司机房成功搭建openssh server跳板服务器
查看>>
ADT在線互動教學
查看>>
PowerShell 添加 自定义的ScriptProperty 属性
查看>>
Shell一些例子
查看>>
MySQL 可优化的一些参数详解
查看>>
zabbix监控web页面,以及告警配置
查看>>
C#中传值调用和传引用调用的理解
查看>>
硬盘整数分区最精确地方法(转载)
查看>>
Oracle-压缩数据
查看>>
Exchange Server2010系列之十六:客户端访问方式
查看>>
crawler4j 爬爬知多少
查看>>
记录:Protocol Buffers(protobuf)在Java开发中使用
查看>>
关于Diablo3的历史和现状思考
查看>>