NIO系列-02-升级版BIO
来源:互联网 发布:软件项目立项过程 编辑:程序博客网 时间:2024/05/17 07:08
声明
该系列文章由书籍《Netty权威指南》第二版整理而来。只为记录学习笔记。
若认为内容侵权请及时通知本人删除相关内容。
- 时间服务器升级版线程池的BIO
- 服务端代码
- 客户端代码
- 总结
时间服务器–升级版(线程池)的BIO
服务端代码
服务端主程序
public class TimeServer { public static void main(String[] args) { int port = 1234; ServerSocket server = null; try { server = new ServerSocket(port); System.out.println("The time server is listening in port : " + port); Socket socket = null; // 线程池 ClientHandlerPool singleExecutor = new ClientHandlerPool(50, 10000); while (true) { socket = server.accept(); singleExecutor.execute(new TimeServerHandler(socket)); } } catch (IOException e) { e.printStackTrace(); } finally { if (server != null) { try { server.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
服务端线程池
public class ClientHandlerPool { private ExecutorService executor; public ClientHandlerPool(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); }}
服务端处理器类
public class TimeServerHandler implements Runnable { private Socket socket; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public TimeServerHandler(Socket socket) { this.socket = socket; } @Override public 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 body = null; while (true) { body = in.readLine(); if (body == null) break; out.println(this.sdf.format(new Date())); } } 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(); } } } }}
客户端代码
客户端代码和上一篇文章“传统BIO”一致。
总结
这种升级版BIO模型有如下特点:
- 服务端资源开销可控
- 当服务端队列积满后,新的连接必须排队
- 可能导致所有的新的连接都超时
参考资料: 《Netty权威指南》第二版
0 0
- NIO系列-02-升级版BIO
- NIO系列-01-传统BIO
- 一句话系列之NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(九) Java NIO与BIO
- BIO-NIO-AIO(Java版)
- BIO-NIO-AIO(Java版)
- BIO | NIO | AIO (Java版)
- BIO | NIO | AIO (Java版--转)
- BIO、NIO、AIO简析Java版
- Java 学习系列: IO相关的BIO,NIO与AIO
- BIO/AIO/NIO
- BIO VS NIO
- BIO AIO NIO
- QT笔记——在QMainWindow内直接添加Layout行不通
- struts获取web页面时,request为null
- Lucene创建索引入门
- Ext_windows 组件(二)
- 【codevs 1130】数字反转
- NIO系列-02-升级版BIO
- 装饰者模式
- 欢迎使用CSDN-markdown编辑器
- 多线程中wait(),notify(),notifyAll()
- NIO系列-03-NIO
- Android——简单说Activity的生命周期
- C++无法调用mex.h文件
- Hibernate中配置C3P0连接池
- 文章标题