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

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){

            }
        }
    }

}

访问效果:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境JMeter脚本性能测试、easyNmon生成监控报告

一、下载JMeter安装包 Jmeter是Java开发的,需要依赖JDK环境,因此我们需提前安装好JDK。 Jmeter是开源的工具,我们直接到官网下载即可。 最新版本下载地址:Apache JMeter - Download Apache JMeter 二、安装JMeter #新建jmete…

关于Java对接网络验证+实践小例子,简单易懂

一个简单的网络验证小例子,各位大佬勿喷 突发奇想,如果一位A友找你拿一份 Working Fruits,但是你不想这位A友把你辛苦劳作、熬夜加点写出的代码分享他或她的另外一位朋友B友,也许并不是很有价值的一个小作业而已,但是就…

draw.io 去除箭头

问题 draw.io 去除箭头 详细问题 笔者使用draw.io绘制流程图,需要没有箭头的连接器,但是General所提供的连接器添加了尾部箭头,如何取消尾部箭头? 解决方案 1、点击选中选择连接器(箭头1)。在格式面板的“Style…

45.i++和++i

目录 一.基本概念 二.区别 三.总结 四.视频教程 一.基本概念 i和i两者的作用都是自增加1。单独使用的话,i和i,效果都是一样的,就是ii1。 int main() {int i 0;i; } int main() {int i 0;i; } 最后的结果都是1。 二.区别 如上单独使…

操作系统系列学习——内存使用与分段

文章目录 前言内存使用与分段 前言 一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油! 本文总结自B站【哈工大】操作系统 李治军(全32讲) 老师课程讲的非常好,感谢 【哈工…

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍 Buffer Pool 原理MySQL中的内存结构Buffer PoolChange BufferLog Buffer redo和undo日志redo日志为什么需要REDO日志redo log 基本概念redo的组成redo的整体流程redo log的刷盘策略 undo 日志undo log 基本概念undo log的作…

Linux:网络相关概念的认识

文章目录 基本认知数据跨网络传输初识ip地址 端口号端口号的理解进程与端口号总结 本篇是基于前面对于网络的基本框架搭建,进而进行相关概念的进一步理解,为后续准备 基本认知 那么首先总结一下一些基本的相关结论性的信息 对于任何协议来说&#xff…

156.乐理基础-和弦固定标记法(五)挂留(sus)和弦省略音(omit)和弦

如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里,这里面有五线谱对应的音名,对比着看 如果一章没落下,看到这里,但是看不懂什么意思,那就强行下看,看着看着指不…

热点!浅谈低代码到底是什么?

低代码平台的历史相对较短,大约始于 2000 年初,源于快速应用程序开发工具。随着低代码平台和工具的日益普及和优势,它不断发展以满足各种领域和角色的需求。 本文将研究各种低代码和无代码应用程序开发方法、业务用例、挑战和未来预测等。 …

定制红酒:品质保障,从源头做起

云仓酒庄的洒派定制红酒,以其卓着的品质和与众不同的口感,赢得了众多消费者的喜爱。而这种品质的保障,正是从源头上开始的。 在葡萄种植方面,种植者对土壤、气候等自然条件进行严格的筛选和评估,确保葡萄能够在理想的环…

递增四元组

解法: 首先都可以想到dp[i]:第i个元素结尾的递增四元组有dp[i]个 然后发现有一组数据:2,3,6,1,5,8。会出现6结尾和5结尾的递增三元组,也就是未来的决策受过去影响,专业的说就是有后效性。需要强化约束条件&#xff0…

普发Pfeiffer分子泵TMH-U1001PC-1601PC安装使用维护说明

普发Pfeiffer分子泵TMH-U1001PC-1601PC安装使用维护说明

【Linux中vim系列】如何在vim中检索字符串

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

最简明的大模型agent教程

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

关闭Elasticsearch built-in security features are not enabled

禁用Kibana安全提示(Elasticsearch built-in security features are not enabled) Kibana提示#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.e…

基于SSM+Jsp+Mysql的KTV点歌系统

基于SSMJspMysql的KTV点歌系统 基于SSMJspMysql的KTV点歌系统的设计与实现 开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工…

Redisson分布式锁(WatchDog分析,浅浅看下源码)

带大家简单了解下Redisson的看门狗机制,这个面试中也比较常见。 目录 WatchDog(看门狗)机制开启WatchDog(看门狗)浅看下源码 WatchDog(看门狗)机制 Redisson看门狗机制是用于解决在业务运行时间…

弱网测试利器 - Charles工具实战分享!

一:弱网测试要点 二:利用抓包工具charles进行弱网设置,适用PC端和移动端(IOS/Android) 1、以charles 4.5.6版本为例,打开Proxy->Throttle Settings 2、打开Throttle Settings,界面…

蓝桥杯练习06给网页化个妆

给页面化个妆 介绍 各个网站都拥有登录页面,设计一个界面美观的登录页面,会给用户带来视觉上的享受。本题中我们要完成一个登录页面的布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: 其中&…

A7680C 4G模块连接MQTT服务器

AT\r\n检查模块正常工作 返回 OK ATCPIN?\r\n检查SIM是否正常 返回: [20:01:31.561]接收←ATCPIN? CPIN: READY OK ATCGREG? //检查网络注册注册状态 返回 [20:02:21.042]接收←ATCGREG?…