同步阻塞通信-伪异步I/O编程
来源:互联网 发布:淘宝店主不同意退货 编辑:程序博客网 时间:2024/06/10 01:25
- 伪异步通信其底层实现还是同步通信,同步通信一请求一应答的特性让每一个客户端请求服务端都需要请起一个线程处理,在高并发的情况下极易容易导致系统资源耗尽而导致宕机等现象,伪异步是通过一个客户端线程池,让线程池中的一个线程处理多个客户端请求,高并发情况下系统线程资源消耗不会增加。
- 服务器实现
package com.haidong.forged_bio;import com.haidong.bio.TimeServerHandler;import java.net.ServerSocket;import java.net.Socket;/** * TimeServer * * @author Lance * @date 2017/05/31 */public class TimeServer { public static void main(String[] args) throws Exception { int port = 8080; if(args.length > 0 && args != null){ try { port = Integer.valueOf(port); } catch (NumberFormatException e) { //采用默认值 e.printStackTrace(); } } ServerSocket server = null; try { server = new ServerSocket(port); System.out.println("时间服务器开启:" + port); Socket socket = null; TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000); while (true){ //监听 socket = server.accept(); singleExecutor.execute(new com.haidong.forged_bio.TimeServerHandler(socket)); } } finally { if(server != null){ System.out.println("关闭服务器"); server.close(); server = null; } } }}
3.线程池编码实现
package com.haidong.forged_bio;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * TimeServerHandlerExcutePool * * @author Lance * @date 2017/05/31 */public class TimeServerHandlerExecutePool { private ExecutorService executor; public TimeServerHandlerExecutePool(int maxPollSize, int queueSize){ executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPollSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize)); } public void execute(Runnable task){ executor.execute(task); }}
4.业务处理
package com.haidong.forged_bio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.Date;/** * TimeServerHandler * * @author Lance * @date 2017/05/31 */public class TimeServerHandler implements Runnable { private Socket socket; public TimeServerHandler(Socket socket) { this.socket = socket; } 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 currentTime = null; String body = null; while (true){ //读取 body = in.readLine(); if (body == null){ break; } System.out.println("服务器接收到客户端内容:" + body); currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER"; out.println(currentTime); } } catch (IOException e) { e.printStackTrace(); if(in != null){ try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } in = null; } if(out != null){ out.close(); out = null; } if(this.socket != null){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } socket = null; } } }}
5.客户端
package com.haidong.forged_bio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * TimeClient * * @author Lance * @date 2017/05/31 */public class TimeClient { public static void main(String[] args) { int port = 8080; if(args.length > 0 && args != null){ try { port = Integer.valueOf(port); } finally { //默认值 } } 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("查询时间success"); String resp = in.readLine(); System.out.println("当前时间" + resp); } catch (IOException e) { e.printStackTrace(); } finally { if(out != null){ out.close(); out = null; } if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } in = null; } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } socket = null; } } }}
6.运行服务端和客户端结果
阅读全文
0 0
- 同步阻塞通信-伪异步I/O编程
- 同步异步阻塞非阻塞I/O
- I/O 阻塞&非阻塞&同步&异步
- 网络编程中阻塞与非阻塞,同步与异步、I/O模型的理解
- C++ socket编程基础五(I/O - 同步,异步,阻塞,非阻塞 )
- UNIX网络编程1 理解同步、阻塞、非阻塞、异步网络I/O
- 【UNIX网络编程】五种I/O模型,阻塞非阻塞同步异步问题详解
- 网络编程中阻塞与非阻塞、同步与异步、I/O模型的理解
- 网络编程中阻塞与非阻塞,同步与异步、I/O模型的理解
- 网络编程中阻塞与非阻塞,同步与异步、I/O模型的理解
- 同步I/O(阻塞I/O),异步I/O(非阻塞)
- 阻塞与非阻塞I/O,I/O复用,同步和异步I/O
- 对I/O阻塞、非阻塞;同步I/O、异步I/O的理解
- I/O模型:同步I/O和异步I/O,阻塞I/O和非阻塞I/O
- I/O 同步,异步,阻塞,非阻塞问题
- Windows I/O模型、同步/异步、阻塞/非阻塞
- unix下的I/O------阻塞,非阻塞,同步,异步
- Windows I/O模型、同步/异步、阻塞/非阻塞
- N
- 数字图像处理——用Java对数字图像写水印
- Unity 游戏框架搭建 (五) 简易消息机制
- 在Winform中向DataGridView控件添加数据的三种方式
- 错误提示:Unable to connect to adb.Check if adb is installed correctly
- 同步阻塞通信-伪异步I/O编程
- 安装mongodb复制集
- Unity 游戏框架搭建 (六) 关于框架的一些好文和一些思考
- rpc
- Android中的信息输出:System.out和Log的源码分析与对比(Log篇)
- php剔除emoji表情符号
- compileDebugNdk'. > Error: Your project contains C++ files but it is not using a supported nati
- iptables基本概念及操作
- Unity 游戏框架搭建 (七) 减少加班利器-QApp类