Java Learn(十七)
网络编程常识、TCP、UDP
网络编程的常识
目前主流的网络通讯软件有:QQ、微信、YY、陌陌、飞信、飞秋、阿里旺旺、支付宝等
七层协议模型
ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
当发送数据时需要按照上述七层协议从左向右一层层进行加包处理,然后发送出去;
当接收到数据时需要按照上述七层协议从右向左一层层拆包,然后解析出来;
常用协议
HTTP
— 超文本传输协议,用于浏览网页的场合
FTP
— 文件传输协议,主要用于上传和下载文件的场合
TCP
— 传输控制协议,主要用于网络通信的场合中
UDP
— 用户数据报协议,主要用于网络童鞋的场合中
IP
— 互联网协议,是上述协议的底层协议
协议 — 本质上就是一种约定/规则,约束了双方通信的具体规则
IP 地址
IP 地址 — 本质上就是在互联网中的唯一标识
IP 地址本质上是由32位二进制组成的整数,叫做 IPV4,当然也有128位二进制组成的整数,叫做 IPV6,目前主流的还是 IPV4.
日常生活中采用的是点分十进制表示法来进行 IP 地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数采用小数点分割。
端口号
IP 地址 — 可以定位到具体的某一台设备
端口号 — 可以定位到该设备中具体的某一个进程
网络编程中需要提供:IP 地址+ 端口号
端口号是由16位二进制组成的整数,范围是:0 ~ 65535,其中 0 ~ 1024 之间的端口通常由系统占用,因此编程从 1025 开始使用。
基于 TCP 协议的编程模型
编程模型
服务器:
(1)创建 ServerSocket 类型的对象,并提供端口号。
(2)等待客户端的连接请求,使用 accept() 方法。
(3)使用输入输出流进行通信。
(4)关闭 Socket 并释放有关资源。
客户端:
(1)创建 Socket 类型的对象,并提供服务器的 IP 地址和端口号。
(2)使用输入输出流进行通信。
(3)关闭 Socket 并释放有关资源。
相关类和方法的解析
(1)ServerSocket 类
java.net.ServerSocket类用于实现服务器的套接字(插座)。
ServerSocket(int port)
— 根据参数指定的端口创建对象并绑定。
Socket accept()
— 用于监听并等待客户端的连接请求。
void close()
(2)Socket 类
java.net.Socket 类用于实现客户端套接字,也就是两台机器通信的端点。
Socket(String host, int port)
— 根据参数指定 IP 和端口号构造对象。
InputStream getInputStream()
— 获取当前套接字的输入流并返回。
OutputStream getOutputStream()
— 获取当前套接字的输出流并返回。
void close()
TCP 协议和 UDP 协议的比较(笔试题)
TCP 协议
TCP — 传输控制协议,是一种面向连接的协议,类似打电话。
— 建立连接 => 进行通信 => 断开连接
— 在通信的整个过程中全程保持连接
— 保证了数据传输的可靠性和有序性
— 是一种全双工的字节流通信方式
— 服务器资源消耗比较大,发送数据的效率相对比较低
UDP 协议
UDP — 用户数据报协议,是一种非面向连接的协议,类似写信
— 在通信的过程中不需要保持连接
— 不保证数据传递的可靠性和有序性
— 是一种全双工的数据报通信方式
— 服务器资源消耗比较小,发送数据的效率相对比较高
基于 UDP 协议的编程模型(重点)
编程模型
主机 A(接收方):
(1)创建 DatagramSocket 类型的对象,并提供指定的端口号;
(2)创建 DatagramPacket 类型的对象,负责接收数据;
(3)接收数据,调用 receive() 方法;
(4)关闭 Socket 并释放有关的资源;
主机 B(发送方):
(1)创建 DatagramSocket 类型的对象;
(2)创建 DatagramPacket 类型的对象,并提供接收方的 IP 地址和端口号;
(3)发送数据,调用 send() 方法;
(4)关闭 Socket 并释放有关资源;
相关类和方法的解析
(1)DatagramSocket 类
java.net.DatagramSocket 类用于描述发送/接收数据报的套接字(码头)。
DatagramSocket()
— 构造对象绑定到任意可用端口;
DatagramSocket(int port)
— 构造对象绑定到参数指定的端口;
void send(DatagramPacket p)
— 将参数指定的数据报发送出去;
void receive(DatagramPacket p)
— 将接收到数据保存到参数指定的数据报中;
void close()
(2)DatagramPacket 类
DatagramPacket(byte[] buf , int length)
— 用于接收数据并保存到 buf 数组中;
DatagramPacket(byte[] buf , int length , InetAddress address , int port)
— 用于将 buf 中的数据发送到 address 上的 port 端口处;
InetAddress getAddress()
— 用于获取发件人的 Address(IP)地址信息;
int getPort()
— 用于获取发件人的端口号信息;
int getLength()
— 用于获取数据的大小/长度;
(3)InetAddress 类
java.net.InetAddress 类用于描述互联网协议地址信息。
static InetAddress getLocalHost()
— 用于获取本地主机的 IP 地址信息
static InetAddress getByName(String host)
— 用于获取指定主机的 IP 地址信息
String getHostName()
— 用于获取主机名并以字符串返回
String getHostAddress()
— 用于获取 IP 地址