[进阶]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;}@Overridepublic 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;}@Overridepublic 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) {}}
}

 

本文链接:https://my.lmcjl.com/post/2031.html

展开阅读全文

4 评论

留下您的评论.