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 ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...
随机推荐
- v-if和v-show的区别与使用
1.共同点: v-if 和 v-show 都能实现元素的显示隐藏. 2.不同点: v-if显示隐藏是将dom元素整个添加或删除,v-show元素隐藏时,会在dom节点中把该元素设置css属性为disp ...
- B树【Balanced-Tree】
一.引言 B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~ 二.二叉树 定义:二叉树即二叉平衡树 意义:通过二分法来进行元素查找,时 ...
- Windows10上安装MySQL(详细)
一.下载MySQL 1.在浏览器里打开mysql的官网http://www.mysql.com 2.进入页面顶部的"Downloads" 3.下滑页面,打开页面底部的"C ...
- SpringBoot中pom引入gson异常
在pom中引入gson依赖,启动spring boot项目中报错 Description:An attempt was made to call the method com.google.gson. ...
- Feedforward neural networks前馈神经网络
Feedforward neural networks or deep feedforward networks or multilayer perceptrons Pass input throug ...
- macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来
macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...
- 开发基于Django和Websocket的堡垒机
WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...
- matlab中repmat函数的用法
转载:https://blog.csdn.net/facetosea1/article/details/83573859 B = repmat(A,m,n)B = repmat(A,[m n])B = ...
- 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...
- Oracle数据库中的大对象(LOB)数据类型介绍
一.LOB数据类型的介绍 大对象(LOB)数据类型允许我们保存和操作非结构化和半结构化数据,如文档.图形图像.视频片段.声音文件和XML文件等.DMBS_LOB 包被设计用于操作 LOB 数据类型.从 ...