缺点:避免了线程资源耗尽的问题,但是根本上来说,serversocket的accept方法和inputstream的输入流方法都是阻塞型方法。

服务端:加了一个线程池,实现线程复用。客户端不变

public class TimeServer {public static void main(String[] args) throws IOException {int port = 8080;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);// 创建IO任务线程池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;}}}
}public class TimeServerHandlerExecutePool {private ExecutorService executor;public TimeServerHandlerExecutePool(int maxPoolSize, int queueSize) {executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS,new ArrayBlockingQueue<java.lang.Runnable>(queueSize));}public void execute(java.lang.Runnable task) {executor.execute(task);}
}

客户端:

public class TimeClient {public static void main(String[] args) {int port = 8080;Socket socket = null;BufferedReader in = null;PrintWriter out = null;try {socket = new Socket("127.0.0.1", port);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);out.println("QUERY TIME ORDER");//发送请求System.out.println("Send order 2 server succeed.");String resp = in.readLine();//回复System.out.println("Now is : " + resp);} catch (Exception e) {e.printStackTrace();} finally {if (this.socket != null) {try {this.socket.close();} catch (IOException e1) {e1.printStackTrace();}this.socket = null;}}}
}

转载于:https://www.cnblogs.com/nazhizq/p/6538687.html

java网络通信:伪异步I/O编程(PIO)相关推荐

  1. Netty权威指南之伪异步I/O编程

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

  2. Netty从入门到精通-伪异步I/O编程

    导语   为了解决BIO面临的一个请求链路需要一个处理线程的问题,然后对其线程模型做了优化,后端通过线程池来对多个客户端请求进行接入处理,形成么客户端M线程池最大线程数N的处理比例关系,但这其中还是M ...

  3. java网络通信:异步非阻塞I/O (NIO)

    首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的SelectableChannel和用于文件操作的Fil ...

  4. java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.我们先来看BIO的问题: 1  没有数据缓冲区,I/O性能存在问题: 2  没有C或C++中的Channel概念,只有输入和输出流: 3  通常会导致通信线程被长时间阻塞: 4  支持的字符集有限 ...

  5. java 异步模型_Java IO编程全解(三)——伪异步IO编程

    为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远 ...

  6. JDK 伪异步编程(线程池)

    伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接.在高性能服务器应用领域,往往需要面向成千上万个客户 ...

  7. 【3月15日】BIO、伪异步IO以及NIO编程实践

    1.引言 从java的I/O体系发展的历史看,先有java.io,后有java.nio.前者一般称之为IO,后者称之为NIO(New IO).但是又由于其特性前者又成为BIO(Block IO),后者 ...

  8. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    首先声明一下,刚开始学习Java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以...呵呵..你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看.. ...

  9. Java异步非阻塞编程的几种方式

    简介: Java异步非阻塞编程的几种方式 一. 从一个同步的Http调用说起 一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响应的数据. 逆地理接口:通过经纬度获取这个 ...

最新文章

  1. 苹果手机换了屏显示无服务器,苹果将​​为存在显示问题的iPhone 11提供免费更换...
  2. Iframe高度自适应(兼容IE/Firefox、同域/跨域)
  3. fail safe java_Java中快速失败(fail-fast)和安全失败(fail-safe)的区别?
  4. python多列填充缺点_在Python中比较多列中的值并在另一列中添加新值
  5. AVPlayer 之avcore模块
  6. weh shell高大上?一文教你实现
  7. 前端学习(1760):前端调试值之如何让浏览器阻止请求相关资源
  8. SDL以及扩展库的交叉编译过程简介
  9. 【2017年第1期】基于外卖物流配送大数据的调度系统
  10. CSS three column layout
  11. angular 注入器配置_注入器和发布库–AngularJS学习笔记(三)
  12. mybatis 3的TypeHandler深入解析(及null值的处理)
  13. QPSK信号在高斯信道、瑞利信道、Ricean信道下的误码率仿真(matlab)
  14. Ubuntu安装JDK6和JDK5
  15. ckplayer 解决flash全屏遮住了div元素,重写全屏/退出全屏方法
  16. mysql alter字段_mysql alter语句添加、修改、删除字段的例子
  17. 应届生 实习生 社招最常用招聘网站
  18. 你的代码会说话吗?(下)
  19. 2021-08-03 git pull 报错 cannot lock ref
  20. pt-archive使用

热门文章

  1. lesson 2.4 - Converting MEL Commands to Python
  2. AI学习笔记(十)卷积神经网络
  3. java生僻字_Android上显示生僻字的方法
  4. 计算机组成原理实用教程第3版课后答案,计算机组成原理实用教程课后习题答案.docx...
  5. a大于10小于15C语言,计算机基础复习模拟试卷
  6. keepalived mysql双主架构图_MySQL数据库架构和同步复制流程
  7. 统计学里“P”的故事:蚊子、皇帝的新衣和不育的风流才子
  8. 移动开发者走向全能开发者的五大技能
  9. Fixjs——自定义事件处理
  10. 如何获得Android设备名称(ADB命令详细介绍)