• TCP通信实战:模拟BS系统


    1、之前的客户端都是什么样的

    • 其实就是CS架构,客户端是需要我们自己开发实现的

    2、BS结构是什么样的,需要开发客户端吗?

    • 浏览器访问服务端,不需要开发客户端

    注意:服务端必须给浏览器响应HTTP协议格式的数据,否则浏览器不识别

     

    1. package com.csdn.d10_bs;
    2. import java.io.IOException;
    3. import java.io.PrintStream;
    4. import java.net.ServerSocket;
    5. import java.net.Socket;
    6. public class BSserverDemo {
    7. public static void main(String[] args) {
    8. try {
    9. //1.注册端口
    10. ServerSocket ss = new ServerSocket(8080);
    11. //2.创建一个循环接收多个客户端的请求
    12. while (true) {
    13. Socket socket = ss.accept();
    14. //3.交给一个独立的线程来处理!
    15. new ServerReaderThread(socket).start();
    16. }
    17. } catch (IOException e) {
    18. throw new RuntimeException(e);
    19. }
    20. }
    21. }
    22. class ServerReaderThread extends Thread {
    23. private Socket socket;
    24. public ServerReaderThread(Socket socket) {
    25. this.socket = socket;
    26. }
    27. @Override
    28. public void run() {
    29. try {
    30. //浏览器 已经与本线程建立了Socket管道
    31. //响应消息给浏览器显示
    32. PrintStream ps = new PrintStream(socket.getOutputStream());
    33. //必须响应HTTP协议格式数据,否则浏览器不认识消息
    34. ps.println("HTTP/1.1 200 OK");//协议类型和版本 响应成功的消息!
    35. ps.println("Content-Type:text/html;charset=UTF-8");
    36. ps.println();//必须发送一个空行
    37. //才可以响应数据回去给浏览器
    38. ps.println("CSDN");
    39. ps.close();
    40. } catch (IOException e) {
    41. throw new RuntimeException(e);
    42. }
    43. }
    44. }

     3、基于线程池BS架构

    1. package com.csdn.d10_bs;
    2. import java.io.IOException;
    3. import java.io.PrintStream;
    4. import java.net.ServerSocket;
    5. import java.net.Socket;
    6. import java.util.concurrent.*;
    7. public class BSserverDemo {
    8. //使用静态变量记住一个线程池对象
    9. private static ExecutorService pool = new ThreadPoolExecutor(3,
    10. 5, 6, TimeUnit.SECONDS,
    11. new ArrayBlockingQueue<>(2),
    12. Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
    13. public static void main(String[] args) {
    14. try {
    15. //1.注册端口
    16. ServerSocket ss = new ServerSocket(8080);
    17. //2.创建一个循环接收多个客户端的请求
    18. while (true) {
    19. Socket socket = ss.accept();
    20. //3.交给一个独立的线程来处理!
    21. pool.execute(new ServerReaderRunnable(socket));
    22. }
    23. } catch (IOException e) {
    24. throw new RuntimeException(e);
    25. }
    26. }
    27. }
    28. class ServerReaderRunnable implements Runnable {
    29. private Socket socket;
    30. public ServerReaderRunnable(Socket socket) {
    31. this.socket = socket;
    32. }
    33. @Override
    34. public void run() {
    35. try {
    36. //浏览器 已经与本线程建立了Socket管道
    37. //响应消息给浏览器显示
    38. PrintStream ps = new PrintStream(socket.getOutputStream());
    39. //必须响应HTTP协议格式数据,否则浏览器不认识消息
    40. ps.println("HTTP/1.1 200 OK");//协议类型和版本 响应成功的消息!
    41. ps.println("Content-Type:text/html;charset=UTF-8");
    42. ps.println();//必须发送一个空行
    43. //才可以响应数据回去给浏览器
    44. ps.println("CSDN");
    45. ps.close();
    46. } catch (IOException e) {
    47. throw new RuntimeException(e);
    48. }
    49. }
    50. }

    4、TCP通信如何实现BS请求网页信息回来呢?

    • 客户端使用浏览器发起请求(不需要开发客户端)
    • 服务端必须按照浏览器的协议规则响应数据
    • 浏览器使用什么协议规则呢?   是 HTTP 协议
  • 相关阅读:
    混淆矩阵绘制
    JavaWeb简单实例——jQuery
    【Java】如何将File转换成MultipartFile
    基于JAVA的学生课程后台管理系统【数据库设计、源码、开题报告】
    mysql 索引执行过程 回表
    卷积神经网络参数量和计算量的计算
    学习太极创客 — MQTT 第二章(七)ESP8266 MQTT 遗嘱应用
    java面试题
    在docker容器里连接上本地mysql8.0.30数据库的方法
    【论文速读,找找启发点】2024/6/16
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133952397