Java nio Server端示例
public class ServerNio {
public static void main(String[] args) throws IOException, InterruptedException {
//打开一个selector
Selector selector = Selector.open();
//打开serverSock通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//非阻塞模式
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8099)); // bind address on port
//向selector注册一个接受客户端事件,如果有客户端想和8099端口建立连接,selector会生成接受连接就绪事件
SelectionKey selectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT, 1);
try {
while (true) {
System.out.println("in while(true)");
//select 注册的key whose channels are ready for I/O operations
int count = selector.select();
System.out.println("select count:" + count);
//在无限循环中,就绪事件个数大于0时,进入逻辑处理流程
if (count > 0) {
//获取就绪事件key
Set<SelectionKey> selectionKeySet = selector.selectedKeys();
Iterator<SelectionKey> selectionKeyIterator = selectionKeySet.iterator();
//遍历就绪的selectionKey
while ((selectionKeyIterator.hasNext())) {
SelectionKey key = selectionKeyIterator.next();
//先remove掉,防止重复处理
selectionKeyIterator.remove();
//如果key是建立连接请求
if (key.isAcceptable()) {
System.out.println("attachment:" + key.attachment());
ServerSocketChannel channel = (ServerSocketChannel) key.channel();
//如果不处理,那么每次都能select到它,接受请求
SocketChannel socketChannel = channel.accept();
socketChannel.configureBlocking(false);
System.out.println("has accept channel");
// socketChannel.socket().setSoTimeout(2000);
//项selector注册读监控事件,可以考虑注册到另一个selector上去,让当前selector只处理accept
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
if (!sc.isOpen()) {
System.out.println("in continue");
continue;
}
//开辟4个byte空间
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.clear();
//从sc中读取byte到buffer中
int bytesRead = sc.read(byteBuffer);
//断开连接了,-1就是socket关闭的意思
if (bytesRead == -1) {
sc.close();
System.out.println("client is out");
continue;
}
System.out.println("读取的byte个数:" + bytesRead);
if (bytesRead > 0) {
//切换为读模式
byteBuffer.flip();
//由于传输的是一个int,这里尝试将4个byte转回int
int value = 0;
value = value | ((byteBuffer.get(0) & 0xFF) << 24);
value = value | ((byteBuffer.get(1) & 0xFF) << 16);
value = value | ((byteBuffer.get(2) & 0xFF) << 8);
value = value | ((byteBuffer.get(3) & 0xff));
//读取到的值
System.out.println("transport value:int:" + value);
}
// sc.register(selector, SelectionKey.OP_WRITE);
} else if (key.isWritable()) {
//类似response
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.clear();
byteBuffer.putInt(3);
sc.write(byteBuffer);
// sc.register(selector, SelectionKey.OP_READ);
}
}
System.out.println("selectionKeySize:" + selectionKeySet.size());
}
Thread.sleep(100);
}
} finally {
Thread.sleep(20000);
selector.close();
}
}
}
Java nio Server端示例的更多相关文章
- Java nio Client端简单示例
java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...
- java nio socket使用示例
这个示例,实现一个简单的C/S,客户端向服务器端发送消息,服务器将收到的消息打印到控制台,并将该消息返回给客户端,客户端再打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本 ...
- 一段关于java NIO server端接受客户端socket连接;演示了关于channel,selector等组件的整合使用
public class ReactorDemo { public static void main(String[] args) throws IOException { ServerSocketC ...
- Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 从I/O多路复用到Netty,还要跨过Java NIO包
本文是Netty系列第4篇 上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll. 那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说 ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- Java NIO原理图文分析及代码实现
原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java ...
- Java NIO原理 图文分析及代码实现
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...
随机推荐
- 预科班D11
2020.09.21星期一 预科班D11 学习内容: 一.基本数据类型及内置方法 1.整形int及浮点型float + - * / // ** % > < >= <= 2.字符 ...
- java ThreadLocal理解和使用
一.ThreadLoal的理解 ThreadLoal 变量,它的基本原理是,同一个 ThreadLocal 所包含的对象(对ThreadLocal< String >而言即为 String ...
- JavaScript,你好!
初识JavaScript 概述 JavaScript是一门世界上最流行的脚本语言 ECMAScript它可以理解为是javaScript的一个标准 而且现在最新的版本已经到es6版本 但是大部分浏览器 ...
- Spring Boot(二) :Redis 使用
Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化.除此 ...
- 使用SSM框架实现图片的上传
SSM实现图片上传功能 效果 在前端页面点击上传图片功能按钮,即弹出文件管理器,选择图片并上传: 思路 在前端页面添加 input 标签,type选择file. 在后端controller编写方法. ...
- 星涛:采用java递归复制文件夹
package com.botao; import java.io.*; /** * @author cbt28 */ public class FileUtil { public static St ...
- CPU 执行程序的秘密,藏在了这 15 张图里
前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...
- WSL2 bug
错误现象 Stdout: Stderr: 2020/05/27 20:01:37 resolving /mnt/host/c/Program Files/Docker/Docker/resources ...
- Redis使用RDB持久化和AOF持久化的区别 - 小白之所见
- Python+Appium自动化测试(5)-appium元素定位常用方法
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor.之前已经介绍过了weditor的使用,这里我将 ...