模拟B\S服务器(扩展知识点)

news2024/11/18 18:21:33

3.2 模拟B\S服务器(扩展知识点)

模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果。

案例分析

  1. 准备页面数据,web文件夹。

    复制到我们Module中,比如复制到day08中

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 我们模拟服务器端,ServerSocket类监听端口,使用浏览器访问

    public static void main(String[] args) throws IOException {
        	ServerSocket server = new ServerSocket(8000);
        	Socket socket = server.accept();
        	InputStream in = socket.getInputStream();
       	    byte[] bytes = new byte[1024];
        	int len = in.read(bytes);
        	System.out.println(new String(bytes,0,len));
        	socket.close();
        	server.close();
    }
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 服务器程序中字节输入流可以读取到浏览器发来的请求信息

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GET/web/index.html HTTP/1.1是浏览器的请求消息。/web/index.html为浏览器想要请求的服务器端的资源,使用字符串切割方式获取到请求的资源。

//转换流,读取浏览器请求第一行
BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requst = readWb.readLine();
//取出请求资源的路径
String[] strArr = requst.split(" ");
//去掉web前面的/
String path = strArr[1].substring(1);
System.out.println(path);

案例实现

服务端实现:

public class SerDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端  启动 , 等待连接 .... ");
        // 创建ServerSocket 对象
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        // 转换流读取浏览器的请求消息
        BufferedReader readWb = new
        BufferedReader(new InputStreamReader(socket.getInputStream()));
        String requst = readWb.readLine();
        // 取出请求资源的路径
        String[] strArr = requst.split(" ");
        // 去掉web前面的/
        String path = strArr[1].substring(1);
        // 读取客户端请求的资源文件
        FileInputStream fis = new FileInputStream(path);
        byte[] bytes= new byte[1024];
        int len = 0 ;
        // 字节输出流,将文件写会客户端
        OutputStream out = socket.getOutputStream();
        // 写入HTTP协议响应头,固定写法
        out.write("HTTP/1.1 200 OK\r\n".getBytes());
        out.write("Content-Type:text/html\r\n".getBytes());
        // 必须要写入空行,否则浏览器不解析
        out.write("\r\n".getBytes());
        while((len = fis.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        fis.close();
        out.close();
        readWb.close();	
        socket.close();
        server.close();
    }
}

访问效果

  • 火狐

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小贴士:不同的浏览器,内核不一样,解析效果有可能不一样。

发现浏览器中出现很多的叉子,说明浏览器没有读取到图片信息导致。

浏览器工作原理是遇到图片会开启一个线程进行单独的访问,因此在服务器端加入线程技术。

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        while(true){
            Socket socket = server.accept();
            new Thread(new Web(socket)).start();
        }
    }
    static class Web implements Runnable{
        private Socket socket;

        public Web(Socket socket){
            this.socket=socket;
        }

        public void run() {
            try{
                //转换流,读取浏览器请求第一行
                BufferedReader readWb = new
                        BufferedReader(new InputStreamReader(socket.getInputStream()));
                String requst = readWb.readLine();
                //取出请求资源的路径
                String[] strArr = requst.split(" ");
                System.out.println(Arrays.toString(strArr));
                String path = strArr[1].substring(1);
                System.out.println(path);

                FileInputStream fis = new FileInputStream(path);
                System.out.println(fis);
                byte[] bytes= new byte[1024];
                int len = 0 ;
                //向浏览器 回写数据
                OutputStream out = socket.getOutputStream();
                out.write("HTTP/1.1 200 OK\r\n".getBytes());
                out.write("Content-Type:text/html\r\n".getBytes());
                out.write("\r\n".getBytes());
                while((len = fis.read(bytes))!=-1){
                    out.write(bytes,0,len);
                }
                fis.close();
                out.close();
                readWb.close();
                socket.close();
            }catch(Exception ex){

            }
        }
    }

}

访问效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传图解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux课程____Samba文件共享服务

一、 Samba服务基础 SMB协议,服务消息块 CIFS协议,通用互联网文件系统 1.Samba 服务器的主要程序 smbd:提供对服务器中文件、打印资源的共享访问 nmbd:提供基于 NetBlOS 主机名称的解析 2.目录文件 /etc/samba/smb.conf 检查工具:test…

Java22重磅发布!!!!卷不动了,真的卷不动了。。。。

就在3月19日,Java22重磅发布。Java22新增了12项增强功能,其中包括七个预览特性和一个孵化器特性,这些功能都显著到足以引起JDK增强提案(JEPs)的关注。它们涵盖了Java语言、其API、性能以及JDK中包含的工具的改进。 真…

01-Spark的Local模式与应用开发入门

1 Spark 的 local 模式 Spark 运行模式之一,用于在本地机器上单机模拟分布式计算的环境。在 local 模式下,Spark 会使用单个 JVM 进程来模拟分布式集群行为,所有 Spark 组件(如 SparkContext、Executor 等)都运行在同…

@EnableConfigurationProperties注解使用

前言 当我们想把配置的内容,动态赋值到某个配置类上的时候,可以使用EnableConfigurationProperties ConfigurationProperties注解 代码准备 创建配置文件prop.properties nameada age18 email123qq.com 创建配置类 ComponentScan("com.test.pops") PropertySo…

nacos-config实现配置中心功能

快速开始 | Spring Cloud Alibaba 官方的demo照着做了一遍,走不通,报各种错误,所以自己搞一个。 jdk版本及安装 因为用的nacos是2022.0.0.0-RC2版本的,要求jdk为jdk21 Java Downloads | Oracle 下载并安装jdk21,重…

异步任务 - 1

Thread Runnable - run function Jdk - 1.5之后 Callable - 范型 其实就是方法的返回值 阻塞等待 线程池 异步非常多 内存是有限的 业务代码内 - 启动线程的方式都不能用 - 会导致资源耗尽 将所有的多线程异步任务都交给线程池进行 - 资源控制 高并发系统 - 线程池 整…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义:任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序: 求高度用后序,求深度用前序。(取决于需不需要从下往上返回结果) 先判断它是不是平衡二叉树 如果是就返回 如…

图论07-被包围的区域(Java)

7.被包围的区域 题目描述 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例 1: 输入:board [["X","X","X",&qu…

【进程概念】进程状态以及僵尸进程(结合代码)

文章目录 进程状态实验观察进程的各个状态动态监视进程的脚本代码样本1:观察S(浅度睡眠)状态代码样本2:观察R(运行)状态发送kill -19 信号 观察T(暂停)状态:调试代码,观察t&#xff…

原型、原型链

如图: 判断对错: Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性 prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。 Q2:通过 proto 属性来连接对象…

MOSDANET

# in the figure refers to the first term of Equation 1 辅助信息 作者未提供代码

2024年【山东省安全员C证】免费试题及山东省安全员C证作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 山东省安全员C证免费试题根据新山东省安全员C证考试大纲要求,安全生产模拟考试一点通将山东省安全员C证模拟考试试题进行汇编,组成一套山东省安全员C证全真模拟考试试题,学员可通过…

Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的环境管理与虚拟环境的使用 在Python开发中,环境管理是至关重要的一环…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

轻松去除视频号水印:高效下载无痕视频教程

短视频已经成为了我们获取知识、娱乐消遣的主要途径之一。而视频号作为一个新兴的短视频平台,凭借其丰富的内容和便捷的操作界面,吸引了大量用户的关注。然而,有时候我们想要保存自己喜欢的视频,却发现视频上带有水印,…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接: 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明: 首先,考虑DFS暴力解:对于蜗牛来说,它出发的起点可能是: 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi, 那么他有三种方式走&…

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象,作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

🔥博客主页:PannLZ 😘欢迎关注:👍点赞🙌收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性,看看各个字段的注释,可是打开一看,居然是乱码的,如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…