netty学习记录(1)
1.传统的bio编程
package com.zhuguozhu.client; /** * 传统bio的客户端 * @author Guozhu Zhu * @date 2018/4/13 * @version 1.0 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { private static int PORT = 8379; private static String IP = "127.0.0.1"; public static void main(String[] args) { for (int i = 0; i < 500000; i++) { BufferedReader bufferedReader = null; PrintWriter printWriter = null; Socket socket = null; try { socket = new Socket(IP, PORT); printWriter = new PrintWriter(socket.getOutputStream(), true); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter.println("客户端"+i+"请求了服务器...."); String response = bufferedReader.readLine(); System.out.println("Client:" + response); } catch (Exception e) { e.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (printWriter != null) { try { printWriter.close(); } catch (Exception e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } else { socket = null; } } } } }
package com.zhuguozhu.server; /** * 传统的bio服务器端 * @author Guozhu Zhu * @date 2018/4/13 * @version 1.0 */ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { private static int PORT = 8379; public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(PORT); System.out.println("服务器端启动了...."); //BIO网络编程 while (true) { //进行阻塞 Socket socket = serverSocket.accept(); //启动一个线程来处理客户端请求 new Thread(new ServerHandler(socket)).start(); } //为异步IO网络编程 //启动一个线程池处理客户端请求 // HandlerExecutorPool pool = new HandlerExecutorPool(50, 1000); // Socket socket; // while (true) { // socket = serverSocket.accept(); // pool.execute(new ServerHandler(socket)); // } } catch (Exception e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } serverSocket = null; } } }
package com.zhuguozhu.server; /** * 服务器端多线程处理流程 * @author Guozhu Zhu * @date 2018/4/13 * @version 1.0 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ServerHandler implements Runnable { private Socket socket; public ServerHandler(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader bufferedReader = null; PrintWriter printWriter = null; try { bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter = new PrintWriter(socket.getOutputStream(), true); while (true) { String info = bufferedReader.readLine(); if (info == null) break; System.out.println("客户端发送的消息:" + info); printWriter.println("服务器端响应了客户端请求...."); } } catch (Exception e) { e.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (printWriter != null) { try { printWriter.close(); } catch (Exception e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } socket = null; } } }
package com.zhuguozhu.server; /** * 服务器端线程池处理流程 * @author Guozhu Zhu * @date 2018/4/13 * @version 1.0 */ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class HandlerExecutorPool { private ExecutorService executor; public HandlerExecutorPool(int maxSize, int queueSize) { this.executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueSize)); } public void execute(Runnable task) { executor.execute(task); } }
传统bio时间服务器:
package nettyexp01; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * 传统bio客户端 * @author Guozhu Zhu * @date 2018/3/14 * @version 1.0 * */ public class TimeClient { public static void main(String[] args) { int port = 8089; if (args != null && args.length > 0) { try { port = Integer.valueOf(args[0]); } catch (NumberFormatException e) { //采用默认的端口值 } } 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 to server success"); String resp = in.readLine(); System.out.println("Now is :" +resp); } catch (Exception e) { //不需要处理 } finally { if (out != null) { out.close(); out = null; } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } socket = null; } } } }
package nettyexp01; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 传统Bio服务器端 * @author Guozhu zhu * @date 2018/3/14 * @version 1.0 * */ public class TimeServer { public static void main(String[] args) { int port = 8089; if (args != null && args.length != 0) { port = Integer.parseInt(args[0]); } ServerSocket server = null; try { server = new ServerSocket(port); System.out.println("The time server is start in port : "+ port); Socket socket = null; while (true) { socket = server.accept(); new Thread(new TimeServerHandler(socket)).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if (server != null) { System.out.println("The time server close"); try { server.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } server = null; } } } }
package nettyexp01; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Date; /** * 传统bio服务器端处理流程 * @author Guozhu Zhu * @date 2018/4/13 * @version 1.0 * */ public class TimeServerHandler implements Runnable { public Socket socket = null; public TimeServerHandler(Socket socket) { this.socket = socket; } @Override public void run() { // TODO Auto-generated method stub BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(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("The time server receive order :" + body); currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body)? new Date(System.currentTimeMillis()).toString():"BAD ORDER"; out.println(currentTime); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); 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 e2) { e2.printStackTrace(); } this.socket = null; } } } }