[进阶]TCP通信实现BS架构,网站开发的原理,线程池优化BS架构
代码演示如下:
服务端
public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端开启!"); //1.创建ServerSocket的对象,同时为服务端注册端口。 ServerSocket serverSocket = new ServerSocket(8080); while (true) { //2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求 Socket socket = serverSocket.accept(); System.out.println("有人上线了:" + socket.getRemoteSocketAddress()); //3.把这个客户端对应的socket通信管道,交给一个对立的线程负责处理 new ServerReaderThread(socket).start(); } } }
服务线程类:
public class ServerReaderThread extends Thread { private Socket socket; public ServerReaderThread(Socket socket) { this.socket = socket; } @Override public void run() { try { OutputStream os = socket.getOutputStream(); PrintStream ps = new PrintStream(os); ps.println("HTTP/1.1 200 OK"); ps.println("Content-Type:text/html;charset=UTF-8"); ps.println(); // 换行 ps.println("<div style='color:red;front-size:120px;text-align:center'>黑马程序员666<div>"); ps.close(); socket.close(); } catch (Exception e) { } } }
扩展知识:
每次请求都开一个新线程好吗?
答:不好,高并发时,容易宕机!
优化代码如下:
服务端
public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端开启!"); //1.创建ServerSocket的对象,同时为服务端注册端口。 ServerSocket serverSocket = new ServerSocket(8080); //创建出一个线程池,负责处理通信管道的任务 ThreadPoolExecutor pool = new ThreadPoolExecutor(16 * 2, 16 * 2,0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); while (true) { //2.使用serverSocket对象,调用一个accept方法,等待客户端的连接请求 Socket socket = serverSocket.accept(); //3.把这个客户端对应的socket通信管道,交给一个对立的线程负责处理 pool.execute(new ServerReaderRunnable(socket)); } } }
服务类线程池
public class ServerReaderRunnable implements Runnable { private Socket socket; public ServerReaderRunnable(Socket socket) { this.socket = socket; } @Override public void run() { try { OutputStream os = socket.getOutputStream(); PrintStream ps = new PrintStream(os); ps.println("HTTP/1.1 200 OK"); ps.println("Content-Type:text/html;charset=UTF-8"); ps.println(); // 换行 ps.println("<div style='color:red;front-size:120px;text-align:center'>黑马程序员666<div>"); ps.close(); socket.close(); } catch (Exception e) { } } }
上一篇: 开发第一个Java程
下一篇: 集成开发工具使用