博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO案例
阅读量:5873 次
发布时间:2019-06-19

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

hot3.png

服务端

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.Iterator;public class Server implements Runnable{	//1 多路复用器(管理所有的通道)	private Selector seletor;	//2 建立缓冲区	private ByteBuffer readBuf = ByteBuffer.allocate(1024);	//3 	private ByteBuffer writeBuf = ByteBuffer.allocate(1024);	public Server(int port){		try {			//1 打开路复用器			this.seletor = Selector.open();			//2 打开服务器通道			ServerSocketChannel ssc = ServerSocketChannel.open();			//3 设置服务器通道为非阻塞模式			ssc.configureBlocking(false);			//4 绑定地址			ssc.bind(new InetSocketAddress(port));			//5 把服务器通道注册到多路复用器上,并且监听阻塞事件			ssc.register(this.seletor, SelectionKey.OP_ACCEPT);						System.out.println("Server start, port :" + port);					} catch (IOException e) {			e.printStackTrace();		}	}	@Override	public void run() {		while(true){			try {				//1 必须要让多路复用器开始监听				this.seletor.select();				//2 返回多路复用器已经选择的结果集				Iterator
keys = this.seletor.selectedKeys().iterator(); //3 进行遍历 while(keys.hasNext()){ //4 获取一个选择的元素 SelectionKey key = keys.next(); //5 直接从容器中移除就可以了 keys.remove(); //6 如果是有效的 if(key.isValid()){ //7 如果为阻塞状态 if(key.isAcceptable()){ this.accept(key); } //8 如果为可读状态 if(key.isReadable()){ this.read(key); } //9 写数据 if(key.isWritable()){ //this.write(key); //ssc } } } } catch (IOException e) { e.printStackTrace(); } } } private void write(SelectionKey key){ //ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); //ssc.register(this.seletor, SelectionKey.OP_WRITE); } private void read(SelectionKey key) { try { //1 清空缓冲区旧的数据 this.readBuf.clear(); //2 获取之前注册的socket通道对象 SocketChannel sc = (SocketChannel) key.channel(); //3 读取数据 int count = sc.read(this.readBuf); //4 如果没有数据 if(count == -1){ key.channel().close(); key.cancel(); return; } //5 有数据则进行读取 读取之前需要进行复位方法(把position 和limit进行复位) this.readBuf.flip(); //6 根据缓冲区的数据长度创建相应大小的byte数组,接收缓冲区的数据 byte[] bytes = new byte[this.readBuf.remaining()]; //7 接收缓冲区数据 this.readBuf.get(bytes); //8 打印结果 String body = new String(bytes).trim(); System.out.println("Server : " + body); // 9..可以写回给客户端数据 } catch (IOException e) { e.printStackTrace(); } } private void accept(SelectionKey key) { try { //1 获取服务通道 ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); //2 执行阻塞方法 SocketChannel sc = ssc.accept(); //3 设置阻塞模式 sc.configureBlocking(false); //4 注册到多路复用器上,并设置读取标识 sc.register(this.seletor, SelectionKey.OP_READ); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new Thread(new Server(8765)).start();; } }

客户端

import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;public class Client {	//需要一个Selector 	public static void main(String[] args) {				//创建连接的地址		InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8765);				//声明连接通道		SocketChannel sc = null;				//建立缓冲区		ByteBuffer buf = ByteBuffer.allocate(1024);				try {			//打开通道			sc = SocketChannel.open();			//进行连接			sc.connect(address);						while(true){				//定义一个字节数组,然后使用系统录入功能:				byte[] bytes = new byte[1024];				System.in.read(bytes);								//把数据放到缓冲区中				buf.put(bytes);				//对缓冲区进行复位				buf.flip();				//写出数据				sc.write(buf);				//清空缓冲区数据				buf.clear();			}		} catch (IOException e) {			e.printStackTrace();		} finally {			if(sc != null){				try {					sc.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}			}	}

 

转载于:https://my.oschina.net/2286252881/blog/865453

你可能感兴趣的文章
多媒体开发之rtmp---rtmp client 端的实现
查看>>
爪哇国新游记之三十四----Dom4j的XPath操作
查看>>
weblogic 安装和部署项目(原创)
查看>>
打开Apache自带的Web监视器
查看>>
WebStorm界面出现中文乱码(出现口口口)
查看>>
浏览器起始页被篡改恶意跳转解决方法
查看>>
3.使用Maven构建Web项目
查看>>
产生6位组合随机数
查看>>
Android录制视频报错setVideoSize called in a invalid state 1
查看>>
angularjs ui-router
查看>>
python nltk 入门demo
查看>>
经典智力题:火车运煤
查看>>
SpringCloud常用注解
查看>>
android尺子的自定义view——RulerView
查看>>
国际化之iPhone设备支持的语种
查看>>
C#匿名方法与Delegate类型转换错误
查看>>
写给今年求职不顺的同学—一个培训师和招聘官看到的求职重大错误
查看>>
回顾我学过的编程语言
查看>>
所谓对的人
查看>>
转 Apache Kafka:下一代分布式消息系统
查看>>