JSON、XML
移动端(安卓、IOS)通讯方式采用http协议+JSON格式 走restful风格。
很多互联网项目都采用Http协议+JSON
因为xml比较重WebService服务采用http+xml格式 银行项目使用比较多
XML:是一种重量级数据交换格式(标记语言)
JSON:本质上是一种轻量级数据交换格式
1.JSON占用宽带小,XML占宽带大
JSON是一种轻量级的数据交换格式,相比XML这种交换格式来说,XML比较复杂,而且需要编写大量的代码,所以客户端和服务器的数据交换格式往往通过JSON来进行交换。
JSON:JavaScript 对象表示法(JavaScript Object Notation)
JSON的形式是用大括号“{}”包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式。
也再次表明javascript里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON代码来创建并赋值。在JSON中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 key:value,key:value的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,
这个属性值的类型可以是 数字、字符串、数组、对象几种;
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
5.java操作JSON有哪些框架?
gson(谷歌)、fastJson(阿里)、jackson(springmvc)
6.fastJson解析json
1.创建maven工程
2.引入fastJson依赖
3.详见程序
XML全称为可扩展标记语言,主要用于描述数据和用作配置文件
XML文档在逻辑上主要由5部分组成:
1.XML声明:指所用XML版本,文档的编码,文档的独立性信息
2.文档类型声明:指XML所用的DTD
3.元素:由开始标签、文档内容和结束标签构成
4.注释:用于文档中的内容,起一个说明的作用
5.处理命令:通过处理命令来通知其他应用程序来处理非XML格式数据,格式为:
XML的文档的根元素被称为文档元素,它和在其他外部出现处理命令,注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。
dom4j:解析XML过程是通过获取document对象,然后继续获取各个节点以及属性等操作。
sax、pull、sax、pull
dom4j不适合大文件的解析,因为它是直接将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以适合解析大文件的xml,
dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,以sax经常用来解析大型xml文件,而对文件进行一些灵活操作就用dom4j。
1.什么是java反射?
就是正在运行,动态获取这个类的所有信息,类可以不用new,使用java反射机制初始化,类中如果有私有属性,可以使用反射机制赋值。
反射机制的核心是当前类的class文件
2.反射机制的作用
1.提高程序的扩展性
3.如何禁止java反射机制?
调用newInsatance方法默认调用无参构造函数创建对象,并且是public类型,将构造函数私有化可禁止反射机制
4.反射机制的应用场景
springIOC、JDBC、框架
5.使用反射机制访问私有属性
把每一个bean(实体类)与bean之间的关系交个第三方容器(spring)管理。
1.解析XML
2.使用bean的id查找对应xml节点,获取class节点属性
3.利用反射机制初始化类
4.利用反射机制给私有属性赋值
3.springIOC使用技术
dom4j+反射机制
springcloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等。
springcloud运行环境简单,springcloud是基于springBoot的。
底层通过httpclient进行封装的。
不同模块部署在不同服务器上
作用:分布式解决网站高并发带来的问题
将一个项目部署多个节点,完成同一个任务
SOA: 架构理念, 面向服务架构
RPC:远程调用技术
微服务架构:将一个项目进行拆分成多个模块,多个模块之间通讯使用PRC远程调用技术。
1.RESTful:是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。
2.SOAP:简单对象访问协议是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。
SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。
soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。
3.RPC:RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
缺点:成本高,开发效率低
优点:解耦、分子项目互不影响
1.什么是服务?
服务就是提供接口。
2.什么是提供服务?
提供接口
3.什么是消费服务?
消费接口
将一些服务信息注册到注册中心中。
1.创建祖册中心类
2.引入springBoot+springcloud+Eureka依赖
3.创建application.yml
4.加入配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
5创建服务类
6.在类前加入EnableEurekaServer注解,表示为服务注册中心
7.在类前加入SpringBootApplication注解,表示该类为启动类
8.启动,用springApplication.run()方法
创建一个服务提供者 (eureka client),当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。
如果心跳超时,则通常将该实例从注册server中删除。
1.创建提供服务类
2.引入springBoot+springcloud+Eureka依赖
3.创建application.yml
4.加入配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8762
spring:
application:
name: service-hi
5.创建提供服务类
6.在类前加入EnableEurekaClient注解,表示该类提供服务
7.启动 同springboot
9.消费服务(ribbon)
1.springcloud调用服务有哪些方式?
restTemplame、feign、ribbon(负载均衡)
2.什么是ribbon?
ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。
3.步骤:
1.创建消费服务端类
2.引入springboot+springcloud+Eureka+ribbon依赖
3.
1.自定义注解
1.什么是注解?
JDK1.5新增技术,注解,很多框架为了简化代码,都会提供注解,可以理解为插件,是代码级别的插件。
2.为什么要用注解?
提高编程效率
3.注解分类
内置注解、自定义注解
4.内置注解
SuppressWarnings:在程序前面加上可以在javac编译中去除警告--阶段是SOURCE
Deprecated:带有标记的包,方法,字段说明其过时----阶段是SOURCE
Overricle:打上这个标记说明该方法是将父类的方法重写--阶段是SOURCE
5.自定义注解
Target:Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。
在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
Retention:表示允许使用反射获取信息
2.设计模式
1.什么是设计模式?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
2.设计模式分类
1.创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2.结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3.行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
3.设计模式的原则
1.开闭原则
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。
为了使程序的扩展性好,易于维护和升级。
2.里氏代换原则
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。
而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3.依赖倒转原则
是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4.接口隔离原则
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5.迪米特法则(最少知道原则)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.合成复用原则
原则是尽量使用合成/聚合的方式,而不是使用继承。
4.单例模式
1.什么是单例模式?
单例保证一个对象JVM中只能有一个实例,常见单例 懒汉式、饿汉式
2.什么是懒汉式?
需要的才会去实例化,线程不安全
3.什么是是饿汉式?
当class文件被加载的时候,初始化,天生线程安全。
5.工厂模式
1.什么是工厂模式?
实现创建者和调用者分离
6.代理模式
1.什么是代理模式?
通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) ,AOP核心技术面向切面编程
2.代理应用场景
安全代理:可以屏蔽真实角色
远程代理:远程调用代理类RMI
延迟加载:先加载轻量级代理类,真正需要在加载真实
3.代理分类
1.静态代理(静态定义代理类)
2.动态代理(动态生成代理类)
Jdk自带动态代理
Cglib 、javaassist(字节码操作库)
4.静态代理
静态代理需要自己生成代理类
5.JDK动态代理
不需要生成代理类,实现InvocationHandler就可以了。JDK的动态代理是通过反射机制生成的。
6.CGLIB动态代理
CGLIB动态代理使用asm框架生成代理
6.JDK动态代理和CGLIB动态代理的区别
jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。
总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。
注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。
asm其实就是java字节码控制
网络编程本质意义是两个设备之间的数据交换,在计算机网络中,设备指的是计算机。
网络编程基本上是基于请求/响应方式的,也就是一个设备发送请求数据给另一个,然后接收另一个设备的反馈。
在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称为客户端(client),等待程序连接的的程序称为服务端(server)
客户端可以在需要的时候启动,而服务器能够时刻响应连接,则需要一直连接。
在网络中需要知道一个设备的位置,则需要使用该设备的IP地址
IP地址是一个规定,现在使用的是IPv4,由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可,在计算机中,IP地址是分配个网卡的,每个网卡都有一个唯一的IP地址
如果计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,在同一网络内部,IP地址不能相同。
由于IP地址不方便记忆,所以创造了域名的概念,也就是给IP地址取一个字符的名字。
在网络中,只能使用IP地址进行数据传输,所以在传输之前,需要把域名转换为IP,这个由DNS服务器完成。
为了在一台设备上可以运行多个程序,设计了端口(port),规定一个设备有216个,也就是65536个端口,每个端口对应一个唯一的程序,每个网络程序,无论是客户端还是服务端,都对应一个或多个特定的端口号
由0-1024之间组成,使用端口号可以找到一台设备上唯一的一个程序,如果需要和某台计算机简历连接,只需要知道IP地址或域名即可
但是如果想知道该台计算机上的某个程序交换数据,还必须知道该程序使用的端口号。
socket是为网络服务提供的一种机制,通讯两端都有socket,网络通讯是socket之间通讯,数据在两个socket之间通过IO传输。
面向无连接,将数据及源的封装到数据包中,不需要建立连接
每个数据报的大小限制在64k内
因无连接,是不可靠协议
需要建立连接,速度快
建立连接,形成传输数据的通道
在连接中进行大量数据传输,以字节流形式
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
在TCP/IP协议中,TCP协议采用三次握手建立一个连接
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器为V状态。
第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABISHED状态,完成三次握手
由于TCP 连接是全双工的,因此每个方向都必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接
收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接再收到一个FIN后仍能发送数据,首先进行关闭的一个方向将执行主动关闭,而另一方执行被动关闭。
1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送
2.服务器B收到这个FIN,发回一个ACK,确定序号为收到的序号加1,和SYN相同,一个FIN将占用一个序号
3.服务器B关闭与客户端A的连接,发送一个FIN个客户端A
4.客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
1.创建socket服务,指定端口
DatagramSocket d=new DatagramSocket(8080);
2.定义接收数据格式
byte[] b=new byte[1024]; ----------()
DatagramPacket datagramPacket = new DatagramPacket(b, b.length); ----()
d.receive(datagramPacket); ---()
3.获取IP地址
String ip = datagramPacket.getAddress().getHostAddress(); ----()
4.获取端口号
int port = datagramPacket.getPort(); ----()
5.获取数据
String str=new String(datagramPacket.getData(),0,datagramPacket.getLength()); ----()
6.关闭连接
d.close(); ----()
DatagramSocket datagramSocket = new DatagramSocket(); ----()
String str="注意了,UDP发送数据来了···"; ----()
byte[] bytes = str.getBytes(); ----()
InetAddress serverIp = InetAddress.getByName("192.168.1.38"); ----()
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,serverIp,8080); ----()
datagramSocket.send(datagramPacket); ----()
d.close();---()
Socket socket = new Socket("192.168.168.1.38",8080); ----()
OutputStream outputStream = socket.getOutputStream(); ----()
outputStream.write("TCP客户端来了。。。。".getBytes()); ----()
socket.close(); ---()
1.创建socket服务端服务,服务端为了让客户端连接上,必须提供一个端口,用于监听
2.获取客户端对象,通过客户端socket流和对应的客户端进行通讯
3.获取客户端socket读取流
4.读取数据并显示在服务端
5.关闭资源
对浏览器客户端和服务器端之间数据传输的规范
HTTP是一个属于应用层的面向对象的协议,由于其简洁、快速的方式,适用于分布式超媒体信息系统
HTTP协议主要包括:
1.支持客户/服务器模式
2.简单快速:客户向服务器请求服务时,只需要传送请求方法和路径,请求方法有:GET、POST、HEAD,每种方法规定了客户与服务器联系的类型不同
由于HTTP协议简单,使得HTTP服务器程序规模小,因而通信速度很快
3.灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由content-type加以标记
4.无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节俭传输时间。
5.无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息则必须重传,
这样导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时应答比较快。
HTTP是使用socket中TCP协议实现,基于请求(客户端)、响应(服务端)
HTTP协议分为请求报文和响应报文
HTTP请求报文由:响应行、响应头、响应体组成
method:请求方式 get/post
get:数据量小,安全性不高 默认方式
post:量大,安全性相对高
action:请求的服务器路径
id:编号:前端区分唯一,js使用
name:名称后端(服务器)区分唯一性,获取值
只要提交数据给后台,必须存在name
HTTP响应报文和请求报文是对应的也是由:响应行、响应头、响应体组成。