网站建设服务费属于,网页设计行业,市场部做网站工作职责,国外网站用什么dns好BS架构简单通俗理解 就是 浏览器–服务器模式#xff0c;浏览器 充当 我们的客户端。 目录 简单BS架构实现案例基本原理视图访问规则案例要求改造前服务端线程模版类 改造后(优化)优化策略服务端线程模版类 参考视频 简单BS架构实现案例
基本原理视图 注#xff1a;服务器必…
BS架构简单通俗理解 就是 浏览器–服务器模式浏览器 充当 我们的客户端。 目录 简单BS架构实现案例基本原理视图访问规则案例要求改造前服务端线程模版类 改造后(优化)优化策略服务端线程模版类 参考视频 简单BS架构实现案例
基本原理视图 注服务器必须给浏览器 响应 HTTP协议 规定的数据格式否则浏览器不识别 返回的数据。 访问规则 服务端若要提供访问服务就必须遵循浏览器的约定规则也就是协议。 案例要求 从浏览器中访问服务器 并立即让服务器响应一个很简单的网页给浏览器 展示网页内容 就是 “12 ITxie_我的IT之路” 改造前
服务端
package com.xie.net.complete.tcp.group.bs;import java.net.ServerSocket;
import java.net.Socket;/*** 目标完成TCP通信快速入门-服务端开发要求实现与多个客户端同时进行通信* */
public class Server {public static void main(String[] args) throws Exception {System.out.println(----------服务端启动成功----------);// 创建ServerSocket对象同时为服务端注册端口号为后续客户端的请求提供访问位置ServerSocket serverSocket new ServerSocket(8080);while(true) {// 使用ServerSocket对象调用accent方法阻塞等待客户端的连接Socket socket serverSocket.accept();System.out.println(有人上线了 socket.getRemoteSocketAddress());// 新建线程把此客户端(这里指浏览器)的 通信管道socket交给 一个独立的线程 负责处理业务new ServerReaderThread(socket).start();}}
}线程模版类
package com.xie.net.complete.tcp.group.bs;import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ServerReaderThread extends Thread {private Socket socket;public ServerReaderThread(Socket socket) {this.socket socket;}Overridepublic void run() {/*** 立即响应一个网页内容”12 ITxie_我的IT之路“给浏览器渲染(包括html标签的渲染)然后展示给用户观看* */try (OutputStream os socket.getOutputStream();PrintStream ps new PrintStream(os)){ps.println(HTTP/1.1 200 OK);ps.println(Content-Type: text/html;charsetUTF-8);// 换行ps.println();ps.println(div stylecolor:red;font-size:120px;text-align:center12 ITxie_我的IT之路/div);socket.close();} catch (IOException e) {e.printStackTrace();}}
}改造后(优化)
优化策略 服务端
package com.xie.net.complete.tcp.group.bs.modify;import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 目标完成TCP通信快速入门-服务端开发要求实现与多个客户端同时进行通信。** 优化前面代码使用线程池解决其中涉及到了资源合理回收利用问题* 解决高并发问题* 改造用线程池来提供服务缓解短时间内大量访问请求可能导致性能瓶颈然后系统宕机的问题* (引起原因系统性能跟不上忙不过来每产生一个新线程都是会消耗系统资源的而资源总归有限)* */
public class Server {public static void main(String[] args) throws Exception {System.out.println(----------服务端启动成功----------);// 创建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) {// 使用ServerSocket对象调用accent方法阻塞等待客户端的连接Socket socket serverSocket.accept();System.out.println(有人上线了 socket.getRemoteSocketAddress());/*** 把通信管道 交给 任务对象 然后 传递给 线程池对象处理。* 其实此客户端的 通信管道socket最终也是交给 一个独立的线程 负责处理业务。* 只不过 此线程 处理完任务后 立即被回收 以待复用。*/pool.execute(new ServerReaderRunable(socket));}}
}线程模版类
package com.xie.net.complete.tcp.group.bs.modify;import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;/*** 包装Socket通信管道的 任务对象模版类其中 定义 需要处理的任务* */
public class ServerReaderRunable implements Runnable {private Socket socket;public ServerReaderRunable(Socket socket) {this.socket socket;}Overridepublic void run() {/*** 立即响应一个网页内容”12 ITxie_我的IT之路“给浏览器渲染(包括html标签的渲染)然后展示给用户观看* */try (OutputStream os socket.getOutputStream();PrintStream ps new PrintStream(os)){ps.println(HTTP/1.1 200 OK);ps.println(Content-Type: text/html;charsetUTF-8);ps.println();ps.println(div stylecolor:red;font-size:120px;text-align:center12 ITxie_我的IT之路/div);socket.close();} catch (Exception e) {e.printStackTrace();}}
}参考视频
黑马磊哥