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端示例的更多相关文章

  1. Java nio Client端简单示例

    java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...

  2. java nio socket使用示例

    这个示例,实现一个简单的C/S,客户端向服务器端发送消息,服务器将收到的消息打印到控制台,并将该消息返回给客户端,客户端再打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本 ...

  3. 一段关于java NIO server端接受客户端socket连接;演示了关于channel,selector等组件的整合使用

    public class ReactorDemo { public static void main(String[] args) throws IOException { ServerSocketC ...

  4. Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)

    1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...

  5. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  6. 从I/O多路复用到Netty,还要跨过Java NIO包

    本文是Netty系列第4篇 上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll. 那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说 ...

  7. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  8. Java NIO原理图文分析及代码实现

    原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

  9. Java NIO原理 图文分析及代码实现

    Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...

随机推荐

  1. v-if和v-show的区别与使用

    1.共同点: v-if 和 v-show 都能实现元素的显示隐藏. 2.不同点: v-if显示隐藏是将dom元素整个添加或删除,v-show元素隐藏时,会在dom节点中把该元素设置css属性为disp ...

  2. B树【Balanced-Tree】

    一.引言 B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~ 二.二叉树 定义:二叉树即二叉平衡树 意义:通过二分法来进行元素查找,时 ...

  3. Windows10上安装MySQL(详细)

    一.下载MySQL 1.在浏览器里打开mysql的官网http://www.mysql.com 2.进入页面顶部的"Downloads" 3.下滑页面,打开页面底部的"C ...

  4. SpringBoot中pom引入gson异常

    在pom中引入gson依赖,启动spring boot项目中报错 Description:An attempt was made to call the method com.google.gson. ...

  5. Feedforward neural networks前馈神经网络

    Feedforward neural networks or deep feedforward networks or multilayer perceptrons Pass input throug ...

  6. macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来

    macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...

  7. 开发基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  8. matlab中repmat函数的用法

    转载:https://blog.csdn.net/facetosea1/article/details/83573859 B = repmat(A,m,n)B = repmat(A,[m n])B = ...

  9. 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布

    简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...

  10. Oracle数据库中的大对象(LOB)数据类型介绍

    一.LOB数据类型的介绍 大对象(LOB)数据类型允许我们保存和操作非结构化和半结构化数据,如文档.图形图像.视频片段.声音文件和XML文件等.DMBS_LOB 包被设计用于操作 LOB 数据类型.从 ...