• 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 协议
  • 相关阅读:
    Java代码审计ssrf基础
    2020年美团Java一面,美团面经面试流程面试题整理
    SpringBoot缓存
    45 二叉树的右视图
    [附源码]SSM计算机毕业设计中达小区物业管理系统JAVA
    python资源库
    mysql explain type 枚举
    强化学习:从入门到入坑再到拉屎
    408王道计算机组成原理强化——输入输出系统大题(I/O)
    【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133952397