为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化——后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽。

当有新的客户端接入时,将客户端Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此资源占用是可控的,无论多少客户端并发访问都不会导致资源耗尽和宕机。

伪异步I/O通信框架采用了线程池实现,避免了每次请求创建一个独立的线程造成的资源耗尽问题,底层通信依然采用BIO同步阻塞模型,无法从根本上解决问题。当对方发送请求或者应答消息比较缓慢(如数据大),或者网路传输较慢时(网速差)读取输入流一方的通信线程将被长时间阻塞,阻塞期间,其他接入消息只能在消息队列中排队。阻塞结束情况:1)有数据可读,2)可用数据已经读取完毕,3)发生空指针或IO异常

package com.hjp.netty.pseudoasynio;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class TimeServerHandlerExecutePool {private ExecutorService executor;public TimeServerHandlerExecutePool(int maxPoolSize, int queueSize) {executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize));}public void execute(Runnable task) {executor.execute(task);}}

线程池处理类

package com.hjp.netty.pseudoasynio;import sun.awt.windows.ThemeReader;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class TimeServer {public static void main(String[] args) throws IOException {int port = 8080;if (args != null && args.length > 0) {try {port = Integer.valueOf(port);} catch (NumberFormatException e) {e.printStackTrace();}}ServerSocket server = null;try {server = new ServerSocket(port);System.out.println("The time server is start in port : " + port);Socket socket = null;TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000);while (true) {socket = server.accept();singleExecutor.execute(new TimeServerHandler(socket));}} finally {if (server != null) {System.out.println("The time server close");server.close();server = null;}}}}

TimeServer

package com.hjp.netty.pseudoasynio;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;public class TimeServerHandler implements Runnable {private Socket socket;public TimeServerHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {BufferedReader in = null;PrintWriter out = null;try {in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));out = new PrintWriter(this.socket.getOutputStream(), true);String currentTime = null;String body = null;while (true) {body = in.readLine();if (body == null) {break;}System.out.println("The time server receive order : " + body);currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER";out.println(currentTime);}} catch (Exception e) {if (in != null) {try {in.close();} catch (IOException e1) {e1.printStackTrace();}}if (out != null) {out.close();out = null;}if (this.socket != null) {try {this.socket.close();} catch (IOException e1) {e1.printStackTrace();}this.socket = null;}}}
}

TimeServerHandler

客户端代码和BIO客户端代码一样

Netty权威指南之伪异步I/O编程相关推荐

  1. 《Netty权威指南》

    <Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码 ...

  2. [201504][Netty 权威指南][第2版][李林锋][著]

    [201504][Netty 权威指南][第2版][李林锋][著] https://github.com/wuyinxian124/nettybook2 基础篇 走进 Java NIO 第 1 章 J ...

  3. netty权威指南第一章

    本章内容如下: 5种网络I/O模型的介绍 I/O多路复用的介绍 1.I/O基础入门 在Java1.4之前,Java对I/O的支持不完善,开发人员在开发高性能I/O的程序时,会面临以下问题: 没有数据缓 ...

  4. 《Netty权威指南》笔记 —— 第二十、二十一、二十二, 二十三章

    <Netty权威指南>笔记--Netty高级特性 第20章 Netty架构剖析 Reactor通信调度层 职责链 ChannelPipeline 业务逻辑编排层 关键架构质量属性 高性能 ...

  5. netty权威指南目录

    目录 第一版 第二版 第一版 目录 基础篇 走进Java NIO 第1章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 1.1.2 I/O多路复用技术 1 ...

  6. IT人物之《Netty权威指南》中文作者 专访华为李林锋:我与Netty那些不得不说的事

    摘要:Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性和可扩展性在同类框架中都是首屈一指的.近日,CSDN采访了Netty领域的权威人士李林锋,请他分享Netty开发的经验之道 ...

  7. 《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门

    前言 Netty权威指南中以时间服务器为入门案例,演示了如何通过Netty完成了服务端与客户端之间的交互过程. 在开始使用Netty开发之前,先回顾一下使用NIO进行服务端开发的步骤. 创建Serve ...

  8. netty权威指南 学习笔记http

    序 李林峰的<netty权威指南>,从Java的NIO开始介绍,后面介绍TCP粘包拆包.中级篇介绍编解码技术. 第10章介绍了HTTP及netty HTTP+XML的技术. 因为xml实际 ...

  9. netty权威指南笔记-以回车换行结尾的消息如何处理半包问题

    概述 TCP底层会发生粘包和拆包,这个是TCP的一个特性.为了减少网络数据传输的次数,TCP总是希望让网络数据到达一定量级的时候才将数据发送出去,而不是缓存区一有数据就马上发送数据. TCP底层会根据 ...

最新文章

  1. Redis生产环境架构选型方案对比
  2. [基础知识]Linux新手系列之三
  3. Oracle 11g Dataguard参数详解
  4. 数据结构--链表--约瑟夫环问题(单向循环链表)
  5. “10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
  6. vscode比较整个文件夹_vscode开发ROS1(5)-ROS工程目录结构
  7. WPF窗体的生命周期
  8. mysql 表名是变量_MySQL深层次的总结
  9. Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
  10. ++i 和 i++ 性能上的区别
  11. 远程服务器传数据库,怎样把本机的mysql数据库上传到远程主机上
  12. Android java获取行号和函数名
  13. 关于解压软件和压缩软件
  14. php防撞库,基于单片机的倒车防撞预警系统设计和实现
  15. catia切割红色框框_如何在CATIA中对零件的实体进行切割,详细始末
  16. 隐藏通信隧道技术:内网穿透工具 nps
  17. 百度地图API学习 - 点击地图显示为中心点
  18. 业务中台的困境、及可能的解
  19. 前端如何判断用户是否打开了控制台
  20. maya为什么不能导出fbx_maya无法导出fbx

热门文章

  1. Python socket Ftp get put 简单实现
  2. IOS项目之弹出动画二
  3. MacOS上的包管理工具
  4. Jscript中window.setInterval和window.setTimeout的区别
  5. php css去除h1样式,HTML中怎么设置h1的字体样式你知道吗?
  6. MySQL单行函数分类
  7. 【思考?】什么时候会触发这个策略呢?
  8. 创建一个带副本机制的topic
  9. 基于Xml 的IOC 容器-载入<bean>元素
  10. Spring 核心容器类BeanFactory