1-1 阻塞、伪异步IO demo与对比

it2022-05-05  112

1、阻塞I/O

阻塞I/O即为最传统的I/O,Server端需要停的Accept(),去轮训接受sokect里的消息,占用资源

练习:先启动Server端,后启动Clinet端

Client.java

import java.io.*; import java.net.Socket; public class Client { public static void main (String ... argas){ BufferedReader in = null; PrintWriter out = null; Socket socket = null; try { socket = new Socket("127.0.0.1",9091); InputStream inputStream = socket.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream); out = new PrintWriter(socket.getOutputStream(),true); out.println("我是客户端"); System.out.println("向客户端发送消息"); in = new BufferedReader(reader); System.out.println(in.readLine()); } catch (IOException e) { e.printStackTrace(); } finally { if(null !=in){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } }; } } }

 

Server.java

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main (String ... args ){ ServerSocket serverSocket = null; Socket socket= null; try { serverSocket = new ServerSocket(9091); while (true){ socket = serverSocket.accept(); System.out.println("客户端来连接了"); new Thread(new ServerHandle(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } finally { if(null!=socket){ System.out.println("处理完毕"); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

 

ServerHandler,java

import java.io.*; import java.net.Socket; public class ServerHandle implements Runnable{ Socket socket; public ServerHandle(Socket accept){ this.socket=accept; } public void run() { BufferedReader in = null; PrintWriter out = null; try { InputStream inputStream=socket.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream); in = new BufferedReader(reader); out = new PrintWriter(socket.getOutputStream(),true); while(true){ String body = in.readLine(); if(null==body){ break; } System.out.println("接收到服务器发来的消息:"+body); out.println("服务器收到了"); } } catch (IOException e) { e.printStackTrace(); } finally { if(null !=in){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } if(null!=out){ out.close(); } } } } }

2、伪异步I/O

BlockingQueue接口及其实现类讲解

https://blog.csdn.net/Howinfun/article/details/80744004

Server.java

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main (String ... args ){ ServerSocket serverSocket = null; Socket socket= null; try { serverSocket = new ServerSocket(9091); while (true){ socket = serverSocket.accept(); System.out.println("客户端来连接了"); //变化 通过ThreadPoolServer创建一个线程池通过有界队列处理 ThreadPoolServer threadPoolServer = new ThreadPoolServer(3,5,3); threadPoolServer.execute(new ServerHandle(socket)); } } catch (IOException e) { e.printStackTrace(); } finally { if(null!=socket){ System.out.println("处理完毕"); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

ThreadPoolServer.java

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolServer { ExecutorService executorService = null; public ThreadPoolServer(int corePoolSize,int maxinumPoolSize,int queueSize){ executorService = new ThreadPoolExecutor(corePoolSize,maxinumPoolSize, 100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize)); } public void execute(Runnable task){ executorService.execute(task); } }

ServerHandler,java --与上面无变化

阻塞I/O 与伪异步I/O对比


最新回复(0)