1.代码
服务端:
TimeServer.java
package com.ccy.IO.pools; 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){ port = Integer.valueOf(args[0]); } ServerSocket server = null; try { server = new ServerSocket(port); Socket socket =null; TimeServerHandlerExecutePool pool = new TimeServerHandlerExecutePool(512, 1024); while(true){ socket = server.accept(); pool.excute(new TimeServerHandler(socket)); } } catch (Exception e) { e.printStackTrace(); }finally{ if(server!=null){ server.close(); server = null; } } } }
TimeServerHandlerExecutePool.java
package com.ccy.IO.pools; 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 excute(java.lang.Runnable task){ executor.execute(task); } }
TimeServerHandler.java
package com.ccy.IO.pools; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.text.SimpleDateFormat; public class TimeServerHandler implements Runnable{ private Socket socket; public TimeServerHandler(Socket socket){ this.socket = socket; } @Override public void run() { System.out.println("TIME SERVER IS LISTENING!!!"); BufferedReader reader =null; PrintWriter writer = null; try { reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); writer = new PrintWriter(this.socket.getOutputStream(),true); String msg =null; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); while(true){ msg = reader.readLine(); if(msg == null){ break; }else{ System.out.println("received msg is:"+msg); writer.println(format.format(new java.util.Date())); } } } catch (Exception e) { e.printStackTrace(); }finally{ if(reader!=null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } reader = null; } if(writer!=null){ writer.close(); writer = null; } if(this.socket != null){ try { this.socket.close(); } catch (IOException e) { e.printStackTrace(); } this.socket = null; } } } }
客户端:
TimeClient.java
package com.ccy.IO.pools; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class TimeClient { public static void main(String[] args) { Socket socket = null; PrintWriter writer = null;; BufferedReader reader = null; try { socket = new Socket("127.0.0.1", 8080); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream(),true); writer.println("what time is it now?"); String resp = reader.readLine(); System.out.println("Now is:"+resp); } catch (Exception e) { e.printStackTrace(); }finally{ if(reader!=null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } reader = null; } if(writer!=null){ writer.close(); writer = null; } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } socket = null; } } } }
代码来自:李林峰《Netty权威指南》
2.分析:
采用线程池实现IO通信框架,避免了为每一个请求创建一个线程而造成的资源枯竭问题。但是依然采用IO同步阻塞模型,无法从根本上解决我们高并发,高性能的需求!
先模仿在创造吧!
更多精彩内容请继续关注我的博客:http://blog.csdn.net/caicongyang
记录与分享,你我共成长
-fromcaicongyang