一、NIO

NIOServer.java

package 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.Iterator;/*** NIO服务端*/
public class NIOServer {// 通道管理器private Selector selector;/*** 获得一个ServerSocket通道,并对该通道做一些初始化的工作* * @param port*            绑定的端口号* @throws IOException*/public void initServer(int port) throws IOException {// 获得一个ServerSocket通道ServerSocketChannel serverChannel = ServerSocketChannel.open();// 设置通道为非阻塞serverChannel.configureBlocking(false);// 将该通道对应的ServerSocket绑定到port端口serverChannel.socket().bind(new InetSocketAddress(port));// 获得一个通道管理器this.selector = Selector.open();// 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,// 当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。serverChannel.register(selector, SelectionKey.OP_ACCEPT);}/*** 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理* * @throws IOException*/public void listen() throws IOException {System.out.println("服务端启动成功!");// 轮询访问selectorwhile (true) {// 当注册的事件到达时,方法返回;否则,该方法会一直阻塞selector.select();// 获得selector中选中的项的迭代器,选中的项为注册的事件Iterator<?> ite = this.selector.selectedKeys().iterator();while (ite.hasNext()) {SelectionKey key = (SelectionKey) ite.next();// 删除已选的key,以防重复处理ite.remove();handler(key);}}}/*** 处理请求* * @param key* @throws IOException*/public void handler(SelectionKey key) throws IOException {// 客户端请求连接事件if (key.isAcceptable()) {handlerAccept(key);// 获得了可读的事件} else if (key.isReadable()) {handelerRead(key);}}/*** 处理连接请求* * @param key* @throws IOException*/public void handlerAccept(SelectionKey key) throws IOException {ServerSocketChannel server = (ServerSocketChannel) key.channel();// 获得和客户端连接的通道SocketChannel channel = server.accept();// 设置成非阻塞channel.configureBlocking(false);// 在这里可以给客户端发送信息哦System.out.println("新的客户端连接");// 在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限。channel.register(this.selector, SelectionKey.OP_READ);}/*** 处理读的事件* * @param key* @throws IOException*/public void handelerRead(SelectionKey key) throws IOException {// 服务器可读取消息:得到事件发生的Socket通道SocketChannel channel = (SocketChannel) key.channel();// 创建读取的缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);int read = channel.read(buffer);if(read > 0){byte[] data = buffer.array();String msg = new String(data).trim();System.out.println("服务端收到信息:" + msg);//回写数据ByteBuffer outBuffer = ByteBuffer.wrap("好的".getBytes());channel.write(outBuffer);// 将消息回送给客户端}else{System.out.println("客户端关闭");key.cancel();}}/*** 启动服务端测试* * @throws IOException*/public static void main(String[] args) throws IOException {NIOServer server = new NIOServer();server.initServer(8000);server.listen();}
}

二、OIO

package OIO;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*** 传统socket服务端*/
public class OioServer {@SuppressWarnings("resource")public static void main(String[] args) throws Exception {ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();//创建socket服务,监听10101端口ServerSocket server=new ServerSocket(10101);System.out.println("服务器启动!");while(true){//获取一个套接字(阻塞)final Socket socket = server.accept();System.out.println("来个一个新客户端!");newCachedThreadPool.execute(new Runnable() {@Overridepublic void run() {//业务处理handler(socket);}});}}/*** 读取数据* @param socket* @throws Exception*/public static void handler(Socket socket){try {byte[] bytes = new byte[1024];InputStream inputStream = socket.getInputStream();while(true){//读取数据(阻塞)int read = inputStream.read(bytes);if(read != -1){System.out.println(new String(bytes, 0, read));}else{break;}}} catch (Exception e) {e.printStackTrace();}finally{try {System.out.println("socket关闭");socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

netty学习01--nio与oio的比较相关推荐

  1. Java游戏服务器系列:传统的BIO(OIO)、NIO与Netty中的BIO(OIO)、NIO

    BIO .NIO .OIO BIO就是OIO,BIO是阻塞IO模型(Block-I/O) NIO是非阻塞IO模型(Non-Block I/O), 有人将NIO称作(New-I/O),所以也将BIO称之 ...

  2. Netty学习笔记:二、NIO网络应用实例-群聊系统

    实例要求: 编写一个NIO群聊系统,实现服务器端和多个客户端之间的数据简单通讯(非阻塞): 实现多人群聊: 服务器端:可以监测用户上线.离线,并实现消息转发功能: 客户端:通过channel可以无阻塞 ...

  3. Netty学习笔记一NIO基础

    Netty学习笔记一 一. NIO 基础 non-blocking io 非阻塞IO (也可称为new IO, 因为是JDK1.4加入的) 1. 三大组件 1.1 Channel 通道:数据的传输通道 ...

  4. Java并发编程学习-日记1、常见的IO模型、NIO、OIO

    常见的IO模型: 1.同步阻塞IO(Blocking IO): 在Java中,默认创建的socket都是阻塞.同步IO,是一种用户空间与内核空间的IO发起方式.同步IO是指用户空间的线程是主动发起IO ...

  5. Netty 学习笔记(已完结)

    Netty 0代码示例 A.经典IO多线程 // 获取到的inputStream是SocketInputStream,这个类不是公开的,继承了FileInputStream, InputStream ...

  6. 04、Netty学习笔记—(黏包半包及协议设计解析)

    文章目录 一.粘包与半包 1.1.现象分析 1.1.1.粘包.半包情况分析 1.1.2.滑动窗口.MSS限制.Nagle算法介绍 1.2.粘包.半包现象复现 1.2.1.粘包复现 1.2.2.半包复现 ...

  7. Netty,Tcp,socket的java框架,netty学习

    最新更新,报文发送,机器终端(车)与服务端 先学习一下基本内容,以下是基于基本内容 互相转换:byte(字节,字节是数字单位,他的数组是十进制内容),bit(二进制内容,不用操心这部分),十六进制0x ...

  8. Netty学习笔记二网络编程

    Netty学习笔记二 二. 网络编程 1. 阻塞模式 阻塞主要表现为: 连接时阻塞 读取数据时阻塞 缺点: 阻塞单线程在没有连接时会阻塞等待连接的到达,连接到了以后,要进行读取数据,如果没有数据,还要 ...

  9. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  10. Netty学习笔记(一)

    学习圣思园Netty笔记,个人理解 2.netty宏观理解-本节内容: 1.阶段性事件驱动,一个请求分为若干阶段处理,每个阶段根据情况合理分配线程去处理,各阶段间通信采用异步事件驱动方式. 2.net ...

最新文章

  1. 2022-2028年中国TCO导电玻璃行业市场研究分析及前瞻规划报告
  2. 根据c语言数组定义填写下表,C语言程序设计 自测题(三)
  3. 四十四、Python中的statsmodels模块
  4. anaconda3卸载python_机器学习Python编程环境:VSCode+Anaconda
  5. ASP.NET Core 3.0 自动挡换手动挡:在 Middleware 中执行 Controller Action
  6. Java 答疑:编译器和解释器有何区别?Java 语言属于编译型编程语言还是解释型编程语言?
  7. net框架通用对象操作
  8. python输入一个假分数_腾讯内容开放平台
  9. rabbitmq配置文件_RabbitMQ学习
  10. svn 切换账号信息
  11. css 属性名 查询表
  12. [转载] 高级人工智能——第3章 约束推理
  13. NLP --- 文本分类(基于LDA的隐语意分析详解)
  14. JDK 和 JRE 有什么区别?
  15. Linux cp命令的内涵
  16. 这是一个转型AI的励志故事,从非科班到拿下竞赛一等奖
  17. 新能源电动汽车共享汽车TBOX终端-「北斗终端设备」、新能源电动汽车车载TBOX系统应用、智能车载系统终端TBOX与车联网关系
  18. onload事件和ready方法的区别
  19. 交互式shell脚本实操
  20. 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

热门文章

  1. Windows10远程登陆Ubuntu桌面
  2. HFSS15 win10安装
  3. 百度网盘超级会员,年卡低至198元!百度官方直充,会员实时生效!
  4. 百度网盘会员-免费领取
  5. python 最速曲线
  6. uni-app 输入框类型
  7. JETT(三)-多Sheet渲染
  8. 《德米安》从那以后伤口很痛,但偶尔我会找到钥匙,沉入心底
  9. 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译
  10. 【无标题】水泥稳定层施工