01-15网络编程-XML

  • 网络编程
  • Web服务器
  • XML

网络编程

  1. 项目架构:

C[Client] /S[Server- Service] -访问这个程序时用客户端

缺点:

1.用户需要单独安装客户端,

2.客户端升级了用于需要重新更新不能跨平台:

3.不同的操作系统都需要相应版本的程序

优点:

1.性能和安全性:客户端与服务器直接交互

B[Browser]/S[Server - Service] - 访问这个项目/程序的时候用浏览器

优点:

1.使用浏览器充当客户端,用户不需要单独安装,浏览器一般不用更新

2.都用的是浏览器

缺点:

1.客户端与服务器不直接交互,而是通过http协议网络交互,性能较差

  1. 网络编程

概念:网络编程,也被称为套接字编程,客户端和服务端必须要进行交互才能完成整个项目,前端后端需要进行交互(前端传输数据到后端,后端响应数据给前端),这个操作叫做网络编程

  1. 网络通信

ip地址:为实现网络中不同计算机之间的通信,每台计算器都必须有一个唯一的标识,那就是IP地址(公网IP)

port端口号:IP地址用于找到某一台计算机,但是计算机里面有很多程序,所以端口号用来找到这个计算机中的某个程序

java 复制代码
//1. 同一台机器上不能有两个程序使用同一个端口,会冲突。例如Java中报错端口号冲突:Address already in use

//2. 以后开发中最好记住我们用到过的常用软件的端口,避免我们知己设定端口的时候和他们冲突。例如tomcat-8080、mysql-3306、http协议-80(不用写出来)、https-443

网络协议:国际组织统一规定好的一套建立连接、数据传输的规则被称为网络通信协议,现目前所有的设备、程序之间通信都遵守此规则

java 复制代码
// 设备之间进行网络通信,需要进行连接以及传输数据,那么就需要事先规定好通信规则,大家都遵守同一套规则才能建立连接

// 广泛使用的是基于OSI网络参考模型进行改进的TCP/IP网络模型
应用层 ---> HTTP、FTP、SMTP等
传输层 ---> UDP、TCP等
网络层 ---> IP等
数据链路和物理层 ---> 比特流等
// TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据
    
// UDP(User Datagram Protocol):用户数据包协议
   特点:无连接、不可靠通信、通信效率高。适用于视频直播、语音通话、游戏等业务
/*
协议说明:

1.通信双方之间无需建立连接,发送方并不知道接收方到底接收到没有,也不会管对方到底在不在线,数据发送之后有可能丢失,接收方接收到了也不返回确认,所以是不可靠协议
2.数据按照包的形式发送,一包数据包含:自己的IP、程序端口、目的地IP、程序端口和数据等等,数据一包限制在64KB之内,如果超过64KB那么会进行分包发送
*/
    
// TCP(Transmission Control Protocol):传输控制协议
   特点:面向连接、可靠通信、通信效率相对UDP不高,适用于文件上传下载等业务
/*
协议说明:

1.传输数据之前必须先获取连接,而且还提供数据确认和超时重传机制,确保数据的完整

2.TCP主要靠三步实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接
*/
    
// Http(Hyper Text Transfer Protocol):超文本传输协议
   规定了浏览器与服务器之间数据传输的规则(如何将数据进行包装)
/*
Http协议特点

1. 基于TCP协议:面向连接,安全可靠
2. 基于请求、响应模型:一次请求对应一次响应
3. Http协议是无状态协议:无法在多次请求之间共享数据,每次请求、响应都是独立的。现在已经通过会话技术解决了Http无状态问题了
 
	请求数据包:请求行(请求方式,请求地址,协议)、请求头、请求体(post请求的参数就放在这里)
	
请求行:请求方式GET + 请求资源路径/hello + 协议/版本HTTP/1.1。请求方式:常用GET、POST
	例如: GET /hello HTTP/1.1
请求头:格式为key:value形式,设置浏览器的一些自身信息和想要响应的形式

	响应数据包:响应行(协议、响应码200)、响应头、响应体(服务器响应给你的数据,html,图片,json...)
响应行:协议/版本-HTTP/1.1、响应状态码-200、状态码描述:OK
	例:HTTP/1.1 200
响应体:存储响应的数据,谷歌浏览器响应体在Preview/Response中:

响应状态码:我们先主要认识四个状态码,其余的等后期用到了再去掌握

- 200 ok 客户端请求成功
- 404 Not Found 请求资源不存在
- 400 Bad Request 请求语法错误,通常是参数类型错误
- 500 Internal Server Error 服务端发生不可预期的错误
	
	get请求与post请求的区别:
	get:
	1.get请求把请求参数放在地址栏
	2.get请求不安全
	3.数据大小有显示,大约4kb左右
	4.get请求只能进行url编码
	5.get请求可以被浏览器缓存
	post:
	1.post请求的参数被放在请求体中
	2.get请求较安全
	3.数据大小长度没有限制。
	4.post请求支持多种编码方式。
	5.post请求不能被浏览器缓存
*/

注意:IP地址用来区分计算机,端口号区分某个程序

3.1 DNS

概念:DNS服务器(Domain Name System Server)是互联网中的一种计算机服务器,用于解析域名并将其转换为相应的IP地址

当在浏览器输入一个域名时,其实计算器会先从本地host文件中去解析域名(本地文件中存储了一些常用的域名),如果没有就会去请求DNS服务器解析域名。而DNS服务器的作用就是帮助计算机和互联网用户将域名转换为对应的IP地址

Tomcat

概念:Tomcat是一个开源免费的web服务器,同时也是一个Servlet容器

1.安装 - 解压安装

2.目录结构

bin - 命令【启动,停止的命令】

conf - 配置信息

lib - jar包

logs - 日志

webapps - 保存项目的地方

3.开启tomcat

4.访问:http://可以省略掉 - 因为浏览器地址栏默认是是http://

完整的地址:

http://ip:port/项目名/资源名 - http://可以省略,如果port是80可以省略掉,如果项目名ROOT也可以省略掉,资源名是index也可以省略掉

默认端口号可以在conf里的server里面修改

XML(Extensible Markup Language)可扩展标记语言

  1. XML概述

1.1概念:通过标签为数据赋予意义的行为称为标记,为标记定义规则的语言叫做标记语言

1.2. XML与HTML区别

XML

  • 被设计用来传输和存储数据的
  • 旨在传输数据,现在更多被用于框架的配置文件格式,焦点是数据

HTML

HTML

  • 被设计用来显示数据的
  • 旨在显示信息,焦点是数据的外观
  1. XML作用

2.1. 传输数据

通过XML,可以在不兼容的系统之间交换数据,也可以在前后端之间交换数据,因为xml和json都是一种通用(很多语言都能解析xml拿到里面的数据)数据交换格式

注意:目前都是使用JSON格式进行数据交换

2.2. 持久化数据

程序中通过IO流将数据以XML格式存储到磁盘中进行持久化,不过现在更多的是将数据存储到数据库中

2.3. 框架配置文件

现在XML更多的是作为各大框架的配置文件,比如MyBatis、Spring框架,下图是MyBatis官网的配置文件示例

优点:

  1. 结构化数据:XML 允许定义具有层次结构的元素和属性,这使得数据更加清晰和易于理解。
  2. 易于阅读和编辑:XML 文档以纯文本格式存储,因此可以使用任何文本编辑器进行查看和编辑。
  3. 跨平台和语言独立:XML 是一种国际标准,可以在不同的操作系统、编程语言和应用程序之间进行交换和使用。
  4. 可扩展性:XML 支持自定义标签和属性,可以根据特定需求扩展配置文件的功能。
  5. 易于解析和解析库:许多编程语言提供了用于解析 XML 的库和工具,使得读取和写入 XML 配置文件变得相对容易。
  1. XML语法

3.1. XML声明

XML声明或文档声明并非是一种标签,其用于指明是什么文档、版本号和编码(除了XML还有HTML)

  • version:指定XML编码,XML从创建之初到目前都是1.0版本

  • encoding:避免中文乱码,所以指定编码为UTF-8

    注意:文档声明必须在XML文件的第一行,且每个XML文件必须有文档声明,XML文件必须以xml结尾

    java 复制代码
    <?xml version="1.0" encoding="UTF-8" ?>

3.2. 标签命名规则

  • 标签名称只能以字母或下划线开头
  • 标签名称中间不能有空格
  • 标签名称之间不能使用特殊字符

3.3. XML语法规则

  • XML中有且仅有一个根标签/元素:XML中的标签是以层级关系进行嵌套,内层如何嵌套都可以,但是外层必须有一个根标签

  • 必须有闭标签:

    • 第一种闭标签:此种标签无法编写文本以及其他标签,也被称为单标签 - xml基本没有,很少
    • 第二种闭标签:此种标签可以编写文本以及其他标签,也被称为双标签 - 开始标签与结束标签
  • 严格区分大小写:在XML中,标签的名称必须一致

  • 嵌套需要正确标签:在XML中可以进行标签嵌套,也就是双标签中定义标签

  • 文本内容和属性:在XML中,所有的标签也被称为元素。双标签中的内容称为文本。标签中可以进行属性定义,属性值必须加引号,多个属性以空格隔开

3.4. 转义字符

文本中使用特殊字符会报错,所以我们需要使用转义字符进行代替,也可以使用转义标签进行代替

< < 小于

> > 大于

& & 和号

' ' 单引号

" " 引号

转义标签,特殊符号会进行原样展示:<![CDATA[ 这是转义标签,特殊字符会进行原样展示 < > & '' "" ]]>

  1. XML约束

4.1. 概念:限制一个XML文件中标签、属性值、以及顺序等的使用,只能按照某种指定的规则书写

  • 在编写XML时有提示
  • 写错会报错

4.2.常见的约束有两种:

DTD约束(Document Type Definition) - 文档类型定义

优点:

1.可读性高

2.容易理解

创建方式一:内部引入

概念:在xml文件中编写DTD约束,只能当前xml文件有效,使用较少

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!--
    内部DTD约束
        1.!DOCTYPE:固定语法,表明文档类型,也就是声明DTD约束的标签
        2.students:自定义,表明根标签名称是什么,此处写什么XML标签的根标签就必须是什么
        3.[]:自定义子标签的地方
            1.!ELEMENT:指定标签或元素,在标签名称后面可以跟 ()去指定规则
            2.students (student+):意思是在students根标签中只能定义student标签
               		 1.(student):在students中必须有且仅有一个student标签
               	 	 2.(student?):在students中可以有0~1个student标签
              	     3.(student+):在students中至少有一个student标签
                 	 4.(student*):在students中可以有0~*个student标签
            3.student (name+, age+, sex+):表示在student中有哪些标签,顺序就是子标签的编写顺序
                	 1.子标签也可以使用空?+*等规则,同样适用
                     2.name (#PCDATA):指定标签不能再有子标签
            4.!ATTLIST:自定义,表名标签的属性是什么
                student id:指定student标签的属性名称为 id
                CDATA:指定属性的规则
                1.#REQUIRED:此属性必须写
                2.#FIXED "值":指定此属性的固定值,也可以不写,如果写就必须是固定值
                3.#IMPLIED:指定此属性的值可写可不写
-->
<!DOCTYPE students[
            <!ELEMENT students (student+)>
            <!ELEMENT student (age+, sex+,name+)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT sex (#PCDATA)>

            <!ATTLIST student id CDATA #REQUIRED>
            <!ATTLIST name test1 CDATA #FIXED "100">
            <!ATTLIST sex test2 CDATA #IMPLIED>
        ]>
<students>
    <student id="1">
        <age>8</age>
        <sex test2="99">男</sex>
        <name test1="100">张三</name>
    </student>
</students>

创建方式二:外部引入

概念:外部引入就是将DTD约束定义在.DTD文件中,在xml文件中引入DTD文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>

<!-- 外部引入SYSTEM:表示引入本地的dtd文件 -->
<!DOCTYPE students SYSTEM "xml-test-03.dtd">
<students>
    <student id="1">
        <age>8</age>
        <sex test2="99">男</sex>
        <name test1="100">张三</name>
    </student>
</students>

注意:后面的学习的MyBatis框架就使用DTD约束,而且它引入的DTD文件是官方写好的,引入了线上的DTD文件

Schema约束(XML Schema Definition)- XML模型定义

优点:

1.一个XML文件中只能引用一个DTD约束,但是一个XML文件可以引用多个schema约束

缺点:

1.Schema约束比DTD约束功能更加强大,但是编写更加复杂

使用:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<students
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.itsource.cn"
        xsi:schemaLocation="http://www.itsource.cn xml-test-05.xsd">
    <student id="1">
        <name>Neuronet</name>
        <age>18</age>
        <sex>男</sex>
    </student>
</students>

注意:后面的学习的Spring框架就使用Schema约束

  1. DOM模型(Document Object Mode)文档对象模型

5.1概念:当结构化文档XML/HTML加载到内存中会形成一个一个的对象,而且这些对象会根据文档的层级关系虚拟一个树型机构的DOM模型,帮助开发者进行解析(CRUD操作)

D Document 文档(XML文档) : 磁盘上面的xml文件
O Object 对象(内存中对象) : 把xml文件封装成对象
M Model 模型:xml文件与对象对应关系模型

5.2DOM关键字

Document文档 文档对象,代表整个XML文档
Node节点 Node节点,也叫做Node对象,一切都是节点:元素,属性,文本
Element元素 元素/标签节点
Attribute属性 属性节点
Text文本 文本节点
  1. XML解析

6.1 概念:XML解析:就是在Java代码中通过一些技术去操作XML,因为通常来说我们都需要对XML的数据进行CRUD

6.2 XML解析四大技术

  • DOM解析:由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点进行操作。不仅可以对文档进行查询,还可以进行增删改。但对大型XML文件效果可能会不理想
  • SAX解析:SAX不用将整个文档加载到内存,基于事件驱动的API,他按照xml文件的顺序一步一步的来解析,解析速度快,但是无法对文档内容进行增删改
  • JDOM解析:JDOM既有树的遍历,又有SAX的java规则。JDOM是处理XML的纯JAVA-API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口
  • Dom4J解析:Dom4J是一个简单的开源库,用于处理XML、 XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM、SAX、JAXP。Dom4J是目前在XML解析方面是最优秀的,它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持(直接通过路径表达式找到想要操作的节点 - 提高开发效率)、XML Schema 支持以及用于大文档或流化文档的基于事件的处理
java 复制代码
// Dom4j并不属于Java自身的工具,是第三方的,那么在Java程序中如果要使用第三方的工具就必须引入第三方的依赖包,也就是Jar包
1.解压压缩包
2.找到后缀名是.jar的包
3.idea中新建一个lib文件夹
4.将jar包放入后右键Add as Library... 再ok

案例:需求1:遍历classes.xml获取所有学员的信息

java 复制代码
@Test
public void test1() throws Exception{
    //将classes.xml加载到内存中
    SAXReader reader = new SAXReader();
    //相对路径从项目开始写
    Document document = reader.read("xml/classes.xml");

    //获取文档的根元素classes
    Element rootElement = document.getRootElement();
    //获取跟元素下所有的子元素
    List<Element> list = rootElement.elements(); //3个student
    //遍历
    for (Element student : list) {
        //获取每一个student的id属性值
        String id = student.attributeValue("id");
        System.out.println(id);
        //获取student的所有子元素
        List<Element> sons = student.elements();
        //遍历
        for (Element son : sons) {
            //获取子元素的文本
            String content = son.getTextTrim();
            System.out.println(content);
        }
        System.out.println("===============================");
    }
}

需求2:向xml中新增一个学员{"id":4,"name":"阿狸","age":20,"address","动物园"}

java 复制代码
@Test
public void test2() throws Exception{
    //将classes.xml加载到内存中
    SAXReader reader = new SAXReader();
    //相对路径从项目开始写
    Document document = reader.read("xml/classes.xml");
    //获取根元素
    Element classes = document.getRootElement();

    Element student = classes.addElement("student");
    student.addAttribute("id","4");
    student.addElement("name").setText("阿狸");
    student.addElement("age").setText("20");
    student.addElement("address").setText("动物园");

    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
    xmlWriter.write(document);
    xmlWriter.close();
}

需求3:修改xml中阿狸的年龄

java 复制代码
@Test
public void test3() throws Exception{
    //将classes.xml加载到内存中
    SAXReader reader = new SAXReader();
    //相对路径从项目开始写
    Document document = reader.read("xml/classes.xml");
    //获取根元素
    Element classes = document.getRootElement();

    List<Element> elements = classes.elements();
    Element student = elements.get(3);
    Element age = student.element("age");
    age.setText("40");
    /*for (Element student : elements) {
            List<Element> sons = student.elements();//name,age,address
            for (Element son : sons) {
                if(son.getName().equals("name") && son.getText().equals("阿狸")){
                    //获取当前元素的父元素【student】,再获取student里面的age
                    Element age = son.getParent().element("age");
                    age.setText("30");
                    break;
                }
            }
        }*/

    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
    xmlWriter.write(document);
    xmlWriter.close();
}

需求4:删除xml中的阿狸

java 复制代码
@Test
public void test4() throws Exception{
    //将classes.xml加载到内存中
    SAXReader reader = new SAXReader();
    //相对路径从项目开始写
    Document document = reader.read("xml/classes.xml");
    //获取根元素
    Element classes = document.getRootElement();

    //获取根元素下所有的子元素
    List<Element> students = classes.elements();
    //遍历
    for (Element student : students) {
        //获取student元素下的name元素
        Element name = student.element("name");
        //name的内容是否是"阿狸"
        if(name.getText().equals("阿狸")){
            //通过根元素删除掉当前student元素
            classes.remove(student);
        }
    }

    //创建一个输出格式
    OutputFormat format = OutputFormat.createPrettyPrint();
    //再使用输出流将文档按照指定的格式输出
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
    xmlWriter.write(document);
    xmlWriter.close();
}

课程总结

  1. C/S架构与B/S架构的区别

    C/S架构的需要安装软件,每次更新都需要重装,但是安全,效率高 B/S架构 不用单独安装,通过http协议交互,效率低

  2. 网络通信需要哪些角色:ip地址,port端口号,通信协议,域名,DNS服务器

  3. TCP与UDP区别

    TCP : 可靠 双向连接 效率低 UDP:不可靠 无连接 效率高

  4. Http协议是什么,有什么用

    基于TCP协议:面向连接,安全可靠

    一次请求,一次响应

    无状态协议:无法在多次请求之间共享数据,每次请求、响应都是独立的

  5. 请求数据包中有哪些内容,响应数据包由哪些内容

    请求数据包中:请求行(请求方式,请求地址,协议),请求头,请求体

    ​ 例: get/hello HTTP/1.1

    响应数据包: 响应行(协议、响应码200),响应头、响应体(服务器响应给你的数据,html,图片,json...)

  6. Get请求与Post请求的区别

    get请求的参数在地址栏会显示,不安全,请求的容量最多4kb,只能够使用url编码且可以被浏览器缓存

    post请求的参数在请求体中,安全,容量没有限制,随意编码,无法被缓存

  7. 常见的响应状态码有哪些,分别表示什么意思

    200 客户端请求成功

    404 指定资源找不到,但是服务器访问是成功了的

    400 请求参数错误

    500 后端数据错误

  8. IP地址与Port有什么用

    ip地址为了找到相对应的计算机 port为了找到启动哪个程序

  9. 域名有什么作用,域名解析流程

    作用:方便,好记

    流程:首先去本机localhost找这个域名,没有就发送到DNS服务器,解析后给你返回一个ip地址

  10. 常见的web服务器有哪些:weblog,websp...

    tomcat jetty

  11. Tomcat是什么

    Tomcat是一个开源免费的web服务器,同时也是一个Servlet容器

  12. Tomcat如何部署项目

    将项目文件拖进webapps

  13. XML解析方式有哪些,分别有什么特点

    DOM 将整个XML文档读入内存构建一个DOM树来对各个节点进行操作 对文档进行查询,还可以进行增删改 对大型XML文件效果可能会不理想

    SAX 不用将整个XML文档读入内存,解析速度快,但是无法对文档内容进行增删改

    JDOM JDOM既有树的遍历,又有SAX的java规则

    Dom4j Dom4J是一个简单的开源库,用于处理XML、 XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM、SAX、JAXP

相关推荐
网络安全(king)10 分钟前
基于java社交网络安全的知识图谱的构建与实现
开发语言·网络·深度学习·安全·web安全·php
艾希逐月19 分钟前
【动手实验】TCP 连接的建立与关闭抓包分析
网络·tcp/ip
Chenyu_31023 分钟前
05.基于 TCP 的远程计算器:从协议设计到高并发实现
linux·网络·c++·vscode·网络协议·tcp/ip·算法
洛神灬殇1 小时前
【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理
运维·服务器·网络
Bruce Jue2 小时前
计算机网络开发(3)——端口复用、I\O多路复用
网络·计算机网络
菜腿承希3 小时前
第二篇:CTF常见题型解析:密码学、逆向工程、漏洞利用、Web安全
网络·安全·web安全
步黔4 小时前
网络安全之文件上传漏洞
网络·安全·web安全
gma9994 小时前
【RTSP】客户端(一):RTSP协议实现
网络
他不爱吃香菜6 小时前
HTTPS工作原理与安全机制详解(仅供参考)
运维·网络·信息与通信