Java常用API(三)
相关链接
网络模型
- OSI:Open System Interconnection 开放系统互联参考模型
- TCP/IP参考模型
- 物理层:网线是物理层介质。
- 数据链路层:将物理层接收的数据进行MAC地址封装与解封装。该层数据叫帧。设备是交换机,交换机每个口都有MAC地址。
- 网络层:对数据链路层数据进行IP地址封装。该层数据是数据包。设备是路由器。
- 传输层:定义传输协议和端口号。发送数据规则。TCP,UDP等。该层数据叫段。
- 会话层:建立会话
- 表示层:进行数据的解析,加密解密,压缩解压
- 应用层:计算机的应用软件
![image]()
网络通讯要素
Java网络编程的包是net包
IP地址
折叠代码块YAML
复制代码
1 | 127.0.0.1: 本地回环地址。访问本机使用 |
端口号
- 同一个计算机的不同应用程序标识。标识进程的逻辑地址
- 端口号在0-65535.0-1024通常为保留端口(系统级端口),不要用。
- 防火墙:禁用进来和出去的端口就无法进行数据交互了。
传输协议
- 传输协议就是传输规则(传输层的协议)
- 传输层的两种协议UDP(数据报文协议),TCP(传输控制协议)折叠代码块YAML 复制代码
1
2
3
4
5
6
7
8
9
10
11
12UDP: 将数据,源地址,目的地址封装到数据包。
- 不需要建立连接,速度快,不可靠协议,无法知道是否到达。
- 数据包大小限制在64K。类似快递。
- 对讲机,QQ,在线视频使用UDP,可能丢失一些数据,但是速度快。
TCP: 建立连接后才数据通讯。
- 通过三次握手完成连接。
- 是可靠协议,对方断开不传输数据,不丢包。
- 必须建立连接。效率低。
- 类似打电话。下载用的就是TCP。
比较:
- UDP可能丢包,但是速度快。
- TCP速度较慢,但是不会丢包。
网络相关知识
- DNS:(Domain Name System)域名解析服务器,进行域名与IP对应关系的记录
- 先请求域名,域名从DNS服务器中找到对应IP返回自己的主机,自己根据该IP访问域名所属网站。
- 域名解析顺序:本地hosts->互联网
- 局域网的某台机器装一个DNS服务器软件,配置好域名解析,然后本地DNS指向该机器的IP,访问网址的时候就会自动从这台DNS服务器进行域名查询。
- C类地址,IP前三字段都是网络位,IP的第四个字段为0是网络位,相当于网段
- ip地址主机位从1-254有效,255是广播字段,会把消息广播到网段中所有IP中。可用于群聊
InetAddress
特点
- 表示网络的IP地址。在网际层。
- 没有构造函数,使用静态方法返回对象。
常用方法
折叠代码块YAML
复制代码
1 | InetAddress getLocalHost(): 返回本地主机ip地址对象 |
UDP传输流程
DatagramSocket创建数据包套接字对象DatagramPacket创建发送或接收数据包对象- 使用DatagramSocket发送或接收数据包
- 关闭socket流
TCP传输流程
Socket
- 实现客户端套接字
- 术语叫做套接字,是为网络服务提供的一种机制
- 可以理解为通讯的端点,数据在Socket中进行IO传递。需要通信两端都有Socket
- TCP客户端创建的过程
- 创建Socket对象,并指定要连接的IP与Port,明确目的主机
- 如果连接建立成功,就形成了一个数据传输通道(socket流)。可以从该Socket对象获取输入输出流对象进行数据传输。
- 使用输出流写出数据或使用输入流写入数据
- 关闭Socket流(这里可以不用关闭,服务器端会统一关闭,但是需要给服务器端发送结束标记,否则服务器端也不会关。)
ServerSocket
- 实现服务端套接字
- TCP服务端创建的过程
- 创建ServerSocket对象
- 给服务端提供一个监听端口,否则客户端无法连接
- 获取连接过来的客户端Socket对象,并获取其输入流或输出流对象
- 使用输出流写出数据或使用输入流写入数据
- 关闭资源(需要关闭客户端,服务端如果需要一直进行服务提供则可以不用关闭。)
DatagramSocket
用于表示发送和接收数据报包的套接字
常用方法
折叠代码块YAML
复制代码
1 | 构造方法: |
DatagramPacket
特点
- 表示数据报包,实现无连接的投递服务。不对包投递做出保证。
- 包含包中的数据,目的地址,源地址。所以封装对象更方便。
常用方法
折叠代码块YAML
复制代码
1 | 构造函数: |
UDP传输示例
折叠代码块JAVA
复制代码
1 | // 发送端代码 |
多线程聊天室
折叠代码块JAVA
复制代码
1 | // 线程开启 |
Socket
常用方法
折叠代码块YAML
复制代码
1 | 构造方法: |
tcp客户端实例
客户端用于连接服务端,发送和接收数据均可
折叠代码块JAVA
复制代码
1 | Socket socket = new Socket("127.0.0.1", 10001); |
SocketAddress
封装了IP + Port
ServerSocket
常用方法
折叠代码块YAML
复制代码
1 | 构造方法: |
tcp服务端实例
服务端用于接收客户端信息,发送和接收数据均可
折叠代码块JAVA
复制代码
1 | ServerSocket ss = new ServerSocket(10001); |
TCP传输问题
传输过程两端都在等,接收不到数据
- 有阻塞式方法。数据留在了缓冲区,没有发出去。
- 需要进行数据刷新
- 没有读取到数据结束标记
- 例如服务端使用
readLine()读取客户端发送的数据,没有发送换行符,所以一直进行数据等待
- 例如服务端使用
英文大写转换服务器
折叠代码块JAVA
复制代码
1 | // TransClient |
上传文本文件
折叠代码块JAVA
复制代码
1 | // UploadClient |
服务器多线程上传图片
折叠代码块JAVA
复制代码
1 | // UploadPicClient |
客户端和服务端常识
- 服务端的无限循环不要怕,主要是因为循环中有
阻塞方法,资源没进来就进行等待。不耗费CPU - 如果判断一次,使用if,如果判断多次,使用while
- HTTP是应用层规则。是一种通讯协议,通讯规则。
- 192.168.1.100(自己的主机地址)和127.0.0.1都可以访问本地主机
- C/S需要做客户端和服务端
- 开发成本较高,维护比较麻烦。
- 可以在本地分担一部分运算。例如杀毒就不适合使用B/S
- 客户端游戏速度更快,效果更好。
- B/S不需要做客户端,直接有浏览器就行
- 开发成本较低,维护较简单。
- 所有运算都在浏览器
常见客户端
如浏览器
- 早期浏览器都是IE内核,改了下外观。
- IE是单窗口的,一个页面一个窗口。遨游将IE改为单窗口,多标签形式,切换更方便
- 基于IE内核可能收费,所以后期基于webkit(开源免费)
常见服务端
如服务器:可以对外提供服务的机器。
- Oracle:数据库服务器
- Tomcat:Web资源访问服务器。处理请求并给予应答。折叠代码块YAML 复制代码
1
2Servlet: 服务端的处理都需要实现Servlet(Server Applet)接口
webapp: 用于访问web应用 - 网络硬盘:存储服务器
服务端多线程
折叠代码块JAVA
复制代码
1 | // 服务端多线程伪代码 |
浏览器的服务端
可以使用ServerSocket写一个服务端,浏览器访问该服务端,接收返回信息并解析。
折叠代码块JAVA
复制代码
1 | ServerSocket ss = new ServerSocket(10001); |
应答消息的含义
折叠代码块YAML
复制代码
1 | HTTP/1.1 200 OK: 应答行:HTTP协议版本 应答状态码 应答状态描述信息 |
常用状态码
折叠代码块YAML
复制代码
1 | 200: OK 请求成功 |
浏览器的客户端
使用Socket写一个客户端,使其访问Tomcat,接收返回信息并解析。
折叠代码块JAVA
复制代码
1 | Socket socket = new Socket("127.0.0.1", 8080); |
浏览器发送的请求消息的含义
折叠代码块YAML
复制代码
1 | GET / HTTP/1.1: 请求行:请求方式 请求路径(这里是根目录) http协议版本。请求行是最主要的。 |
GET提交和POST提交的区别
- GET
- 数据封装在请求行
- 提交大量数据,地址栏有限,放不下
- POST
- 数据封装在请求体
- 可以提交大量数据
URL
特点
- Uniform Resource Locator,统一资源定位符
- 指向互联网资源的指针,资源可以是简单的文件或目录
- 这是一个URL:http://www.lightly.com/project/index.html
- (URL,URN,URI的区别](https://blog.csdn.net/f45056231p/article/details/82530984)
常用方法
折叠代码块YAML
复制代码
1 | 构造方法: |
URI
特点
- Uniform Resource Identifier,统一资源标识符
- 包括URL和URN
- 这是一个URI:http://www.lightly.com/project/index.html#intro
- (URL,URN,URI的区别](https://blog.csdn.net/f45056231p/article/details/82530984)
URLConnection
特点
- Java中内置的可以解析具体协议的对象+Socket
- 只能获取该对象,不能进行实现。
常用方法
折叠代码块YAML
复制代码
1 | getHeaderField(String): 用键获取消息头对应键的值 |
反射
含义
- 运行状态中,对任意一个类(
class文件)都能知道这个类的所有属性和方法 - 对任意一个对象,都能够调用它的任意一个方法和属性
- 这种动态获取的信息及动态调用对象的方法的功能叫做java的反射机制。
- 可以理解为对类的解剖。
- 反射所有的对象都在
java.lang.reflect包下(反射包),用于解析类成员对象
应用场景
- 对指定名称的字节码文件加载并获取其内容进行调用
- 例如Tomcat中自己实现了Servlet,需要Tomcat运行自己的程序,只需要把自己的程序配置到web.xml,Tomcat就可以执行了。Tomcat就动态的获取了这个类的信息。这里用了反射。
- 用户不用创建对象,把自己的类放到配置文件里就可以运行了
作用
大大提高了程序扩展性
Class
含义
描述字节码文件的类,用来获取字节码文件的内容(名称,字段,构造函数,一般函数)
作用
用于获取字节码文件的所有内容。反射就是依靠该类完成的。
获取字节码的方式
- Object类的getClass方法。用的时候需要明确具体的类并创建对象折叠代码块JAVA 复制代码
1
2Worker worker = new Worker("name", 12);
Class clazz = worker.getClass(); - 使用任意类的class静态属性折叠代码块JAVA 复制代码
1
Class clazz = Worker.class;
- 通过给定类的字符串名称获取类,更具扩展性。
使用Class类的方法,是反射主要方式,知道类名字即可。折叠代码块JAVA 复制代码1
2
3// 从当前根目录找,需要写类的全名
Class clazz = Class.forName("ml.lightly.Worker");
Object obj = clazz.newInstance();
早期和现在创建对象比较
- 早期:new的时候,根据类名称找到该类的字节码文件,加载到内存,创建该字节码文件对象,然后根据字节码文件对象创建该类对象
- 现在:
forName()会找到类文件,并加载到内存,产生Class对象,然后newInstance(),创建该类对象
常用方法
折叠代码块YAML
复制代码
1 | Class forName(name): 获取某个类名的Class对象 |
电脑运行
新设备实现接口,并添加配置文件,就可以被源设备使用。
适用于不修改代码,但是可以运行新的设备
定义好规则,后期设备通过该规则扩充,前期设备只操作这个规则即可。
折叠代码块JAVA
复制代码
1 | // pci.properties |
Constructor
特点
是获取的Class的构造器组成的对象
常用方法
折叠代码块YAML
复制代码
1 | newInstance(参数列表): 使用该构造器创建对象。传入相应的参数。返回Object |
Field
特点
是获取的Class的字段组成的对象
常用方法
折叠代码块YAML
复制代码
1 | setAccessible(boolean): 对私有字段的访问取消权限检查。暴力访问 |
Method
特点
是获取的Class的方法组成的对象
常用方法
折叠代码块YAML
复制代码
1 | invoke(Object, Object): 运行某方法,需要传入运行对象和参数列表。返回Object |
正则
作用
主要操作字符串
特点
- 通过特定符号体现
- 简化了,阅读性变差。
正则表达式常用符号
- 大括号控制次数,中括号控制数据范围,小括号用于符号封装
- 会对加了小括号的每个封装体从1进行编号,没有加括号就是第0组
(.)\\1+, 在java里,括号封装了一个匹配模式,这是第一组模式- 正则中用1来标识,但不是普通1,所以加转义符号来标识第一组
- 然后+就是用来对第一组进行操作的符号
^,非,作用于后边的第一个控制范围-,用于数据范围&&,与,用于交集
折叠代码块YAML
复制代码
1 | 字符: |
字符串正则
匹配
匹配手机号
折叠代码块JAVA
复制代码
1 | // 匹配手机号码 |
切割
折叠代码块JAVA
复制代码
1 | // 切割空格字符 |
替换
折叠代码块JAVA
复制代码
1 | // 将叠词替换为一个字符 |
获取
折叠代码块JAVA
复制代码
1 | /** |
String的正则方法
折叠代码块YAML
复制代码
1 | matches(String regex): 检查字符串是否匹配该正则,返回boolean |
Pattern
含义
正则表达式的对象形式.
作用
用于正则表达式的封装,存在于java.util.regex包中.
常用方法
折叠代码块YAML
复制代码
1 | Pattern complie(regex): 将正则封装为正则对象 |
Matcher
含义
匹配器
作用
- 使用正则对象的匹配器对象操作字符串
- 匹配结果留在匹配器中
常用方法
折叠代码块YAML
复制代码
1 | find(): 查找是否有与该模式匹配的字符串的下一个子序列.查找一次,匹配一次.返回 |
- 本文标题:Java常用API(三)
- 创建时间:2022-01-20 17:57:26
- 本文链接:https://blog.212490197.xyz/article/program/java/java-basic-knowledge-4/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
复制版权信息

v1.5.2