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