当前位置: 首页 > news >正文

J032_实现简易版的B/S架构

一、需求描述

实现简易版的B/S架构

1.1 Server

package com.itheima.tcp4;import java.io.IOException;
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;public class Server {//实现简易版的B/S架构public static void main(String[] args) throws Exception {System.out.println("----------服务端启动----------");//创建serversocket对象,同时为服务端程序注册接口ServerSocket serverSocket = new ServerSocket(8080);while (true) {//使用serversocket对象调用accept方法,等待客户端连接Socket socket = serverSocket.accept();System.out.println("有人上线了:" + socket.getRemoteSocketAddress());//与客户端建立连接后,将任务交给独立的线程来处理new ServerReaderThread(socket).start();}}
}

1.2 ServerReaderThread

package com.itheima.tcp4;import java.io.DataOutputStream;
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() {//响应一个网页内容:“黑马程序员”给浏览器展示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("黑马程序员");ps.close();socket.close();} catch (Exception e) {throw new RuntimeException(e);}}
}

1.3 使用线程池进行优化

由于在高并发的情况下,创建太多线程很容易使服务端挂掉,所以用线程池优化B/S架构

1.3.1 Server

package com.itheima.tcp4;import java.io.IOException;
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;public class Server {//实现简易版的B/S架构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对象调用accept方法,等待客户端连接Socket socket = serverSocket.accept();System.out.println("有人上线了:" + socket.getRemoteSocketAddress());//把这个客户端对应的socket通信管道,交给线程池里面的线程负责处理pool.execute(new ServerReaderRunnable(socket));}}
}

1.3.2 ServerReaderRunnable

package com.itheima.tcp4;import java.io.OutputStream;
import java.io.PrintStream;
import java.net.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("黑马程序员");ps.close();socket.close();} catch (Exception e) {throw new RuntimeException(e);}}
}

http://www.lryc.cn/news/414429.html

相关文章:

  • 【前端面试】五、框架
  • C语言 | Leetcode C语言题解之第316题去除重复字母
  • 本地部署 Llama-3-EvoVLM-JP-v2
  • Evaluating the Generation Capabilities of Large Chinese Language Models
  • YOLOv8添加注意力模块并测试和训练
  • 「Unity3D」自动布局LayoutElement、ContentSizeFitter、AspectRatioFitter、GridLayoutGroup
  • 【Golang 面试 - 进阶题】每日 3 题(十六)
  • Redis2
  • C语言--函数
  • Shell 编程的高级技巧和实战应用
  • VMWare虚拟机如何连接U盘
  • 【学习笔记】后缀自动机(SAM)
  • Godot的节点与场景
  • C++ 学习(2) ---- std::cout 格式化输出
  • 前端拿不到Long类型成员变量,用@JsonSerialize(using = ToStringSerializer.class)序列化一下
  • JWT登录校验流程
  • yarn安装和部署
  • Visual Studio的安装教程与使用方法
  • 一键换装软件哪个好?6个换装工具让你秒变穿搭达人
  • 【EtherCAT】Windows+Visual Studio配置SOEM主站——源码配置
  • GPTPDF深度解析:开源文档处理技术全攻略
  • 网络学习:应用层DNS域名解析协议
  • 7.怎么配置一个axios来拦截前后端请求
  • Day17_1--AJAX学习之GET/POST传参
  • golang国内proxy设置
  • 全网最适合入门的面向对象编程教程:31 Python的内置数据类型-对象Object和类型Type
  • 【mongodb】mongodb副本集的搭建和使用
  • Java后端面试复习7.24
  • 前端 HTML 概述
  • 探索Thymeleaf:用动态Web模板引擎打造吸引人的用户界面(SpringBoot的html详解)