JAVA基础学习笔记
2020-04-28 17:00:50 5 举报
AI智能生成
java基础
作者其他创作
大纲/内容
控制执行流程
true和false
if-else
迭代
while
for
逗号操作符
forecah
return
指定一个方法返回什么值
导致当前方法退出,并返回哪个值
break和continue
switch
操作符
操作符
算数运算符: + - + - * / % 前++ 后++ 前-- 后-- +(连接符)
赋值运算符: = += -= *= /= %=
赋值
解释
自动递增和递减
自动递增++a等价于(a = a + 1)
前缀递增++a
后缀递增a++
比较运算符
比较运算符(关系运算符): == != > >= < <= (运算后结果都为 boolean)
==比较的是对象的引用、equals()比较的是对象的内容,而非比较对象的引用
逻辑运算符
逻辑运算符: &&-短路与 ||-短路或 !-非 &-逻辑与 |-逻辑或 ^-异或
位运算符
位运算符 : ~ & | ^ << >> >>> 注意: 没有 <<<
短路
指数
三元操作符
类型转换操作符
截尾和舍入
子主题
子主题
访问权限控制
从最大权限到最小权限依次为:public、protected、包访问权限、private
包:库单元
定制工具库
JAVA访问权限修饰词
包访问权限
public:接口访问权限
private:你无权访问的
protected:继承访问权限
接口和实现
类的访问权限
多态
多态的体现
方法的重载与重写
对象的多态性
多态的前提
要有继承关系
要有方法的重写
向上转型
向下转型
转机
前期绑定
后期绑定
构造器与多态
调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,知道最低层的导出类
按声明顺序调用成员的初始化方法
调用导出类构造器的主体
继承与清理
多态运行
编译时,“看左边”,看的是父类的引用。 (父类中不具备子类特有的方法)
运行时,“看右边”,看的是子类的对象。(实际运行的是子类重写父类的方法)
内部类
成员内部类:在类中声明另一个类,里面的类,称为“内部类”,外面的类,称为“外部类”
类的成员之一
可以使用四种访问控制修饰符(public protected default private)
static final
链接到外部类
使用.this和.new
内部类与向上转型
通过异常处理错误
异常: 不可预知的非正常情况。
异常的结构体系
java.lang.Throwable : 所有错误的异常的父类
java.lang.Error : 错误,一些严重的错误。 如:内存溢出,系统错误等。我们在代码中不对其进行处理
java.lang.Exception : 异常,我们需要尽可能预知并处理的异常。如: 用户输入有误、网络连接中断等
编译时异常(受检异常 checked)
运行时异常(非受检异常 unchecked)
异常的处理
异常的处理方式一
异常的处理方式二
异常的处理方式三
终止与恢复
终止模型
恢复模型
自定义异常
异常与记录日志
异常的说明
捕获所有异常
String getMessage()和String getLoclizedMessage()用来获取详细信息,或用本地语言标识详细信息
String toString()返回对Throwable的简单描述,要是有详细信息的话,也会把它包含在内
void printStackTrace()打印Throwable和Throwable的调用栈轨迹,输出标准错误
void printStackTrace(PrintStream)允许选择要输出的流
void printStackTrace(java.io.PrintWriter)允许选择要输出的流
栈轨迹
重新抛出异常
异常链
JAVA标准异常
使用finally进行清理
异常的限制
类型信息
一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型
“反射”机制,它允许我们在运行时发现和使用类的信息
RTTI
子主题
class对象
类字面常量
.class
泛化的Class引用
反射:运行时的类信息
JAVA程序的运行分为两种状态
编译时:通过javac命令,生成一个或多个的.class字节码文件
运行时:通过java命令,将生成一个或多个字节码问价加载到内存中(由JVM提供的类加载器完成)
实例化Class类对象(四种方法)
子主题
类加载器
引导类加载器(Bootstap Classloader)
扩展类加载器(Extension Classloader)
系统类加载器(System Classloader)
获取properties文件
反射操作
在运行时创建一个类的实例
在运行时获取类的构造器
获取类的属性
代理模式
静态代理
动态代理
数组
数组简介
数组是第一级对象
返回一个数组
多维数组
粗糙数组
数组与泛型
创建测试数据
Arrays.fill()
数据生成器
代码
测试代码
Arrays实用功能
复制数组
数组的比较
数组元素的比较
数组的排序
I/O系统
File类
File类基本操作
递归删除文件目录
目录列表器
目录使用工具
输入和输出
InputStream
ByteArrayInputStream
StringBufferInputStream
FilterInputStream
public void close() throws IOException{}
protected void finalize()throws IOException {}
public int read(int r)throws IOException{}
public int read(byte[] r) throws IOException{}
public int available() throws IOException{}
样例1
PipedInputStream
SequenceInputStream
FilterInputStream
OutputStream
FileOutputStream
public void close() throws IOException{}
protected void finalize()throws IOException {}
public void write(int w)throws IOException{}
public void write(byte[] w)
样例
ByteArrayOutputStream
PipedOutputStream
FilterOutputStream
I/O流的典型使用方式
FileInputStream
注解
注解简介
@Override
@Deprecated
@SuppressWarnings
基本语法
定义注解
元注解
@Target
CONSTRUCTOR:构造器声明
FIELD:域声明(包括enum声明)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
@Rectetion
SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被VM丢弃
RUNTIME:VM将运行期也保留注解,因此可以通过反射机制读取注解的信息
@Documented
@Inherited
没有元素的注解称为标记注解
创建一个注解
编写注解处理器
注解元素
所有基本类型、String、Class、enum、Annotation
默认值限制
要么有默认值,要么在使用注解时提供元素的值
java发送邮件
利用QQ发送邮件
一切都是对象
用引用操纵对象
引用
对象
存储到什么地方
寄存器
堆栈
堆
常量存储
非RAM存储
基本类型
高精度数字
BigInteger
支持任意精度的整数,在运算中,可以准确地表示任何大小的整数,而不会丢失任何信息
BigDecimal
支持任何精度的定点数,可以用他进行精确的货币计算
声明变量的注意
声明 long 型变量时,值后必须加 L 或 l; 如: long l = 12423475L; long l1 = 1232566l;
声明 float 型变量时,值后必须加 F 或 f; 如: float f1 = 234.67F;
声明 double 型变量时,值后可以加 D 或 d;
声明 char 型变量时,值必须使用单引号,并且只能存储单个字符。 使用 Unicode 编码(中文、日文、ASCII、特殊字符)
声明 String 型变量,值必须使用双引号。
数据类型之间的转换
小容量转大容量(系统自动完成)
byte short char ----> int ----> long ----> float ----> double
byte short char 三者之间不做运算,若运算都将自动升级为 int 再做运算
boolean 不参与运算的
大容量转小容量
必须使用强转符 "(需要转换的类型)"。 可能引发损失精度的问题。
变量的概念
在内存中开辟一块内存空间
该空间有类型(数据类型)有名称(变量名)
变量可以在指定的范围内不断的变化
作用域
作用域
对象作用域
类
class
字段:数据成员
基本成员默认值
方法:成员函数
方法、参数和返回值
方法的基本组成部分包括:名称、参数、返回值和方法体
放回类型描述的是调用方法之后从方法返回的值
参数列表给出了要传给方法的信息的类型和名称
f方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法
方法只有通过对象才能被调用。
参数列表
代码块
非静态代码块
格式: 类中的一对 {}
在每次创建对象时被调用
非静态代码块的执行优先于构造器
用于为对象初始化。(通常为共性内容进行初始化)
非静态代码块可以有多个,依次向下的顺序执行
静态代码块
格式: static{}
随着类的加载而加载,并且只加载一次
静态代码块的执行优先于非静态代码块
静态代码块中不能调用非静态成员
静态代码块可以有多个,依次向下的顺序执行
JAVA程序
包
反转域名
import导包
static
只想为某特定域分配单一存储空间,而不去考虑创建多少对象
希望某个方法不与包含它的类的任何对象关联在一起
实现
static int a = 1
子主题
static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象都有一个存储空间
HelloWorld
public关键字指这是一个可由外部调用的方法
main()方法的参数是以String对象的数组,args用来存储命令行参数
注释和嵌入式文档
注释
注释文档
javadoc
语法
javadoc命令都只能/** */注释中出现
主要方式
嵌入HTML
文档标签
三种类型
类
域
方法
javadoc只能为public和protected成员进行文档注释
javadoc标签
@see引用其他类
{@link package.class#member lable}
{@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的超链接
{@inheritDoc}
该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中
@version
@version version-information
version-information可以是任何你认为适合包含在版本说明的重要信息
@anthor
@anthor author-information
是你的姓名,也可以包括电子邮件或者其他任何适宜的信息
@since
该标签允许你指定程序代码最早使用的版本,可以在HTML JAVA文档中看到它被用来指定JDK的版本情况
@garam
@garam paramter-name description
parameter-name是方法的参数列表中的标识符,description是可延续数行的文本,终止与新文档标签出现之前
@return
@return description
description用来描述返回值的含义
@throws
@throws fully-qualified-class-name description
由于某个方法调用失败而抛出的对象
@deprecated
支出一些旧特性已由改进的新特性所取代
编码风格
命名的规则:(必须遵守,若不遵守编译不能通过)
可以使用字母 A-Z a-z 数字 0-9 特殊字符 下划线"_" 和 美元符 "$"
数字不能开头
之间不能包含空格
不能使用关键字和保留字,但是可以包含关键字和保留字
Java严格区分大小写,但是长度无限制数据类型
命名的规范:(可以不遵守,但是会受到鄙视)
包名: 所有字母都小写。如: xxxyyyzzz
类名、接口名:若多个单词,所有单词的首字母都大写。 如: XxxYyyZzz
方法名、变量名: 若多个单词,第一个单词的首字母小写,其他单词首字母都大写。 如: xxxYyyZzz
常量名: 所有字母都大写。每个单词之间以 "_" 分隔。 如: XXX_YYY_ZZZ
初始化与清理
用构造器确保初始化
方法重载
区分重载方法
每一个重载方法都必须有独一无二的参数类型列表
涉及基本类型的重载
以返回值区分重载方法
方法的注意
“返回值类型”与“返回值”的数据类型需要保持一致!
当调用方法时,传递的实际参数与形式参数必须保持一致(参数的个数、参数的类型)
若声明了 “返回值类型”说明该方法运行后返回一个结果,若调用者需要用到该结果,可以声明一个变量接收
若方法运行后不需要返回结果给调用者时,“返回值类型”处声明为 void
void:表示无返回值
void:表示无返回值
方法中不能声明方法,可以调用其他方法
默认构造器
this关键字
在构造器中调用构造器
static的含义
随着类的加载而加载,随着类的消失而消失。(生命周期最长)
static修饰的属性被所有该类的对象所共享
一旦某个对象改变该属性值,其他对象该属性值也会随之改变
静态变量的存在优先于对象
可以通过 "类名.类变量"的方式调用
清理:终结处理和垃圾回收
java的对象并非总是被垃圾回收
对象可能不被垃圾回收
垃圾回收并不等于析构
垃圾回收只与内存有关
finalize()的用途何在
垃圾回收
引用计数
停止----复制
标记-----清扫
成员初始化
构造器初始化
初始化顺序
静态数据的初始化
复用类
组合
代码
初始化引用
在定义对象的地方,这意味着他们总是能够在构造器被调用之前被初始化
在类的构造器中
就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担
使用实例初始化
代码
继承(extends)
示范
初始化基类
代理
结合使用组合和继承
确保正确清理
名称屏蔽
组合和继承之间选择
protected关键字
向上转型
为什么称为向上转型
final关键字
修饰的变量叫常量,一旦被赋值,值不能改变。
命名规范:所有字母都大写,每个单词之间以 "_" 分隔
常量没有默认值。在使用前必须赋值(直接显示赋值、构造器、代码块)
若选择使用构造器为常量赋值,必须保证“所有”构造器都为常量赋值
方法
不能被重写
类
不能被继承
接口
抽象类和抽象方法
抽象类
格式: 访问控制修饰符 abstract class 类名{}
拥有一个或多个抽象方法的类必须是抽象类
抽象类中可以有非抽象方法
抽象类中可以没有抽象方法
抽象类不能创建实例
抽象类中可以声明构造器。目的:当子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化
抽象方法
格式: 访问控制修饰符 abstract 返回值类型 方法名(参数列表);
当子类继承父类后,若重写了父类中“所有”的抽象方法,该类为具体类,可以创建实例
当子类继承父类后,若没有重写父类中“所有”的抽象方法,该类必须为抽象类,不能创建实例
接口
如何使用接口
接口与类是平级的
可以把接口理解为特殊的抽象类。 因为接口中只能定义“全局静态常量”和 “抽象方法”
接口中不能有一般方法、变量、构造器、代码块
接口不能创建实例
接口就是用来被实现的
实现接口的类“实现类”,实现类的功能与“继承”一致。实现类可以“继承”接口中所有的成员
若实现类实现了接口中“所有”的抽象方法,该类为具体类,可以创建实例
若实现类没有实现接口中“所有”的抽象方法,该类必须为抽象类,不能创建实例
若实现类没有实现接口中“所有”的抽象方法,该类必须为抽象类,不能创建实例
接口支持多实现 ------- 解决了Java中单继承的局限性
接口不能继承任何类。 接口可以继承接口,并且可以多继承接口
一个类可以继承另一个类,同时实现多个接口
完全解耦
子主题
JAVA中的多重继承
通过继承来扩展接口
避免组合接口名字冲突
持有对象
集合:就像是一种容器,用于存储、获取、操作对象的容器
List、set、Queue、Map
数组弊端
长度不可变
数组没有提供可以查看有效元素个数的办法
集合特点
集合的长度是可变
集合可以存储任意类型的对象
集合中只能存对象
集合框架
java.util.Conllection接口:是集合层次的根接口
List接口:有序的,允许重复的。因为List体系集合都有索引值
ArrayList:采用数组结构存储元素,查询操作多时选择
继承AbstractList,实现了List、RandomAccess、Serializable、Cloneable接口
RandomAccess可以对元素进行快速访问
Seriallizable可以被序列化
Cloneable可以被复制
ArrayList不是线程安全的
方法
构造函数
trimToSize()
ensureCapacity(int minCapacity)
size()
isEmpty()
contains(Object o)
indexOf(Object o)
lastIndexOf(Object o)
clone()
toArray()
toArray(T[] a)
get(int index)
set(int index,E element)
add(E e)
add(int index,E element)
remove(int index)
remove(Object o)
clear()
LinkedList:采用链表结构存储元素,增删操作多时选择
Vector
Set接口:无序的,不允许重复的
HashSet:是Set接口的典型实现类
LinkedHashSet
TreeSet:拥有自己的排序方式
自然排序(Comparable)
需要添加TreeSet集合中对象的类实现Comparable接口
实现ComparaTo(Object obj)方法
定制排序(Comparator)
声明一个类实现Comparator接口
实现compare(Object o1,Object o2)方法
将实现类的实例作为参数,传递给TreeSet的构造器
java.util.Map
HashMap:是Map接口的典型实现类
LinkedHashMap
是HashMap的子类,相较于HashMap多了链表维护元素的顺序
HashMap
简介
HashMap是一个散列表,它存储的内容是键值对(key-value)映射
HashMap继承与AbstractMap,实现了Map、Cloneable、java.io.Serializable接口
HashMap的实现不是同步的,意味着它不是线程安全的
HashMap的key、value都可以为null
HashMap中的映射不是有序的
HashMap影响性能的参数
初始容量
加载因子
JDK1.8之后HashMap由数组、链表、红黑树实现
HashTable
Properties
用于操作属性文件
TreeMap:根据Key拥有自己的排序方式
自然排序(Comparable)
定制排序(Comparator)
泛型和类型安全的容器
泛型
Arrays和Collections
Arrays,asList()
Collection.addAll()
容器的打印
迭代器
ListIterator
linkedList
Stack
字符串
不可变String
重载“+”与StringBuilder
StringBuilder
无意识的递归
String上的操作
格式化输出
printf()
System.out.format()
Formatter类
格式化说明符
String.formt()
十六进制转储(dumpo)工具
正则表达式
子主题
量词
贪婪型
勉强型
占有型
笔记
泛型
泛型简介
简单的泛型
元组类库
TwoTuple
ThreeTuple
FourThple
FiveTuple
TupleTest
堆栈类
RandomList
泛型接口
泛型方法
杠杆利用类型参数判断
可变参数与泛型方法
用于Generator泛型方法
一个通用的Generator
简化元组的使用
一个set实用工具
容器
填充容器
Collection的功能方法
子主题
代码
子主题
Set和存储顺序
set简介
Set
HashSet*
TreeSet
LinkedHashSet
set实现
SortedSet
功能
Comparator comparator()
Object first()
返回容器中的第一个元素
Object last()
返回容器中的最末一个元素
Sorted subSet(fromElement,toElement)
生成此Set子集,范围从fromElement(包含)到toElement(不包含)
SortedSet headSet(toElement)
生成此Set的子集,由小于toElement的元素组成
SortedSet tailSet(fromElement)
生成此Set的子集,由大于或等于fromElement的元素组成
代码
队列
出并发应用,仅两个实现
LinkedList
PriorityQueue
队列优先级
双向队列
Map
性能
map实现
散列与散列码
枚举
向枚举添加方法
覆盖enum方法
在switch语句中enum
values()神秘之处
并发
线程
线程简介
进程
一个正在执行的应用程序
多进程的作用不是提高执行速度,而是提高CPU的使用率
线程
是一个进程中的执行场景,一个进程可以启动多个线程
线程不是为了提高执行速度,而是提高应用程序的使用率
线程和线程共享"堆内存和方法去内存",栈内存是独立的,一个线程一个栈
实现线程两种方式
继承Thread类
代码
实现Runnable接口(推荐)
代码
线程的启动具有随机性
线程的生命周期
5个状态(新建、就绪、运行、阻塞、消亡)
线程控制
线程的操作
代码
常用API
currentThread()
获得当前线程,如果在main中调用,当前线程是main而不是被start的线程
isAlive()
判断当前线程是否处于活动状态
线程 处于 正在 运行 或 准备 开始 运行 的 状态, 就 认为 线程 是“ 存活” 的。
sleep()
方法 sleep() 的 作用 是在 指定 的 毫秒 数 内 让 当前“ 正在 执行 的 线程” 休眠( 暂停 执行)。 这个“ 正在 执行 的 线程” 是指 this. currentThread() 返回 的 线程。
代码
getId()
getId() 方法 的 作用 是 取得 线程 的 唯一 标识。
停止线程
使用 退出 标志, 使 线程 正常 退出, 也就是 当 run 方法 完成 后 线程 终止。
stop()
这个 方法 是 不安全 的( unsafe), 而且 是 已被 弃 用 作废 的( deprecated)
调用 stop() 方法 时会 抛出 java. lang. ThreadDeath 异常, 但在 通常 的 情况下, 此 异常 不需要 显 式 地 捕捉。
使用 interrupt() 方法 中断 线程。
调用 interrupt() 方法 仅仅是 在当 前 线程 中 打了 一个 停止 的 标记, 并不是 真的 停止 线程。
interrupt()
测试 当前 线程 是否 已经 中断。 线程 的 中断 状态 由该 方法 清除。 换句话说, 如果 连续 两次 调用 该 方法, 则 第二次 调用 将 返回 false( 在 第一次 调用 已 清除 了 其中 断 状态 之后, 且 第二次 调用 检验 完 中断 状态 前, 当前 线程 再次 中断 的 情况 除外)。
代码
正确唤醒线程
isInterrupt()
测试 线程 Thread 对象 是否 已经 是 中断 状态, 但不 清除 状态 标志。
抛出InterruptedException
if (this. interrupted()) { System. out. println(" 已经 是 停止 状态 了! 我要 退出 了!"); throw new InterruptedException(); }
使用 return 停止 线程
建议 使用“ 抛 异常” 的 方法 来 实现 线程 的 停止, 因为 在 catch 块 中 还可以 将 异常 向上抛, 使 线程 停止 的 事件 得以 传播。
暂停/恢复线程
suspend()
废弃的方法
缺点
此方法是独占的,如果拿到锁并且调用了线程的suspend()方法,那其他线程就再也拿不到锁,无法执行了
容易 出现 因为 线程 的 暂停 而 导致 数据 不 同步 的 情况。
resume()
yield()
放弃 当前 的 CPU 资源, 将它 让给 其他 的 任务 去 占用 CPU 执行 时间。 但 放弃 的 时间 不确定, 有可能 刚刚 放弃, 马上 又 获得 CPU 时间 片。
代码
join
代码
线程的优先级
代码
setPriority()
线程 的 优先级 分为 1~ 10 这 10 个 等级, 如果 小于 1 或 大于 10, 则 JDK 抛出 异常 throw new IllegalArgumentException()。
JDK 中 使用 3 个 常量 来 预置 定义 优先级 的 值,
public final static int MIN_ PRIORITY = 1;
public final static int NORM_ PRIORITY = 5;
public final static int MAX_ PRIORITY = 10;
特性
继承 特性
规律性:高优先级的线程总是先执行完
随机性:高优先级的线程不一定每一次都先执行完
线程同步
异步编程模型
t1线程执行t1的,t2线程执行t2的,两个线程之间谁也不等谁
同步编程模型
t1线程和t2线程执行,当t1线程必须等t2线程执行结束之后,t1线程才能执行
为什么要同步?为什么要引入线程同步?
为了数据的安全,尽管应用程序的使用率降低,但是为了保证数据的安全,必须加入线程的同步机制,线程的同步机制使程序变成(等同)单线程
什么条件下要使用线程同步
必须是多线程环境
多线程环境共享一个数据
共享数据涉及到修改操作
线程同步例子
代码
锁
类锁
代码
代码
synchronized还可以应用在static静态方法上,如果这样写,那是对当前的*.java文件对应的Class类进行持锁
Class锁可以对类的所有对象实例起作用
在静态方法上加Synchronized 等同于 Synchoronized(this.getClass())
对象锁
添加在方法上和代码块上的锁都是对象锁
死锁
代码
线程的分类
用户线程
守护线程
守护线程是一种特殊的线程,它的特性有“ 陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。
典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。
但是在主线程中调用守护线程.join(),那就守护不了了
代码
定时器
Timer
TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟。
如果执行任务的时间早于当前时间,则立即执行task任务。
代码
cancel
作用是将任务队列中的全部任务清空。
Timer类中的cancel()方法有时并不一定会停止执行计划任务,而是正常执行。
有时并没有争抢到queue锁,所以TimerTask类中的任务继续正常执行。
TimerTask
几种用法
schedule( TimerTask task, Date time)
在指定的日期执行一次某一任务。
schedule(TimerTask task,Date firstTime,long period)
是在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务。
schedule( TimerTask task, long delay)
以当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimerTask任务。
schedule( TimerTask task, long delay, long period)
当前的时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一任务。
scheduleAtFixedRate( TimerTask task, Date firstTime, long period)
cancel
将自身从任务队列中清除。其他任务不受影响。
凡是使用方法中带有period参数的,都是无限循环执行TimerTask中的任务。
网络编程
网络协议
TCP传输控制协议
TCP头格式
Source Port(源端口号)
数据发起者的端口号,16bit
Destination Port(目的端口号)
数据接收者的端口号,16bit
Sequence Number(顺序号,Seq)
Acknowledgment Number(确认号码,ack)
Offset(TCP报文头长度)
Reserved(保留)
6bit, 均为0
TCP Flags(TCP标志位)
窗口
检验和
紧急指针
TCP选项
TCP协议中的三次握手和四次挥手
建立连接需要三次握手
第一次握手
第二次握手
第三次握手
断开连接需要四次握手
第一次挥手
第二次挥手
第三次挥手
第四次挥手
提醒:中断连接端可以是Client端,也可以是Server端。只要将下面两角色互换即可。
为什么关闭的时候却是四次挥(握)手?
Seq:是发送方当前报文的顺序号码。
ack:是发送方期望对方在下次返回报文中给回的Seq。
TCP报文抓取工具
TCP/IP与OSI模型对比
TCP的特点
TCP是面向连接的运输层协议
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP提供可靠交付的服务
TCP提供全双工通信。
面向字节流。
UDP用户数据报协议
每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方
HTTP超文本传输协议
HTTP主要特点
支持客户/服务器模式
简单快速
灵活
无连接
无状态
请求报文
请求报文结构
请求报文参数
安全性:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
幂等性:表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。
GET和POST请求区别
提交形式
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.
POST方法是把提交的数据放在HTTP包的Body中.
传输数据的大小
GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
因此对于GET提交时,传输数据就会受到URL长度的限制。
因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。
安全性
POST的安全性要比GET的安全性高,具有真正的Security的含义。而且通过GET提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存,其他用户浏览历史纪录就可以拿到账号和密码了
请求报头域
响应报文
响应报文结构
响应状态码
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
200 OK:成功返回状态,对应,GET,PUT,PATCH,DELETE。
201 created - 成功创建。
3xx:重定向--要完成请求必须进行更进一步的操作。
302 Found:重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
例如在IE中输入http://www.google.com. HTTP服务器会返回304, IE取到Response中Location header的新URL, 又重新发送了一 个 Request.
例如在IE中输入http://www.google.com. HTTP服务器会返回304, IE取到Response中Location header的新URL, 又重新发送了一 个 Request.
304 Not Modified:代表上次的文档已经被缓存了, 还可以继续使用。
4xx:客户端错误--请求有语法错误或请求无法实现。
400 bad request - 请求格式错误。
401 unauthorized - 未授权。
403 forbidden - 鉴权成功,但是该用户没有权限。
404 not found - 请求的资源不存在。
405 method not allowed - 该http方法不被允许。
410 gone - 这个url对应的资源现在不可用。
415 unsupported media type - 请求类型错误。
422 unprocessable entity - 校验错误时用。
429 too many request - 请求过多。
5xx:服务器端错误--服务器未能实现合法的请求。
500 Internal Server Error:服务器发生了不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
响应报头域
session
Cookie
FTP文件传输协议
FTP服务器
支持FTP协议的服务器就是FTP服务器。
匿名FTP
anonymous
使用方式
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP的任务是从一台计算机将文件传送到另一台计算机,不受操作系统的限制。
传输方式
ASCII
二进制
支持模式
Port模式
Passive模式
命令实例
java代码
Socket 编程
两台计算机之间使用套接字建立TCP连接时会出现
服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信
服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口
服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接
Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信
在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socke
ServerSocket
Socket
clint
server
InetAddress
0 条评论
下一页