一、网络编程简介
网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。
网络编程涉及基本概念:
一次网络数据传输时: 发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。 接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。 收发端:发送端和接收端两端,也简称为收发端。
请求和响应: 一般来说,获取一个网络资源,涉及到两次网络数据传输: 第一次:请求数据的发送。 第二次:响应数据的发送。
客户端和服务端 服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。 客户端:获取服务的一方进程,称为客户端。
二、Socket 套接字
Socket 套接字,是由系统提供用于网络通信的技术,是基于 TCP/IP 协议的网络通信的基本操作单元。基于 Socket 套接字的网络程序开发就是网络编程。
Socket 套接字主要针对传输层协议划分为如下三类:
- 流套接字:使用传输层 TCP 协议。
- 数据报套接字:使用传输层 UDP 协议。
- 原始套接字:用于自定义传输层协议。
三、TCP/UDP 简介
socket api:传输层提供给应用层的 API。 传输层的两个核心协议是:TCP 与 UDP 协议。
- TCP 协议:有连接,可靠传输,面向字节流,全双工的协议。
- UDP 协议:无连接,不可靠传输,面向数据报,全双工的协议。
3.1 有连接 vs 无连接
有/无连接:是一个抽象的概念,虚拟的逻辑上的连接。就像前面的链表的学习一样,物理上不连续,但通过节点之间的关联使其逻辑上连续。
TCP 协议中:保存了对端的信息,让两个通信之间的设备有连接。就如 AB 通信,A 保存 B 信息,B 保存 A 信息。
UDP 协议中:UDP 本身不保存对端信息,但可以自己使用代码保存。
3.2 可靠传输 vs 不可靠传输
丢包:网络上数据发生丢失的情况就是丢包。
传输中丢包情况造成原因:
- 当光/电/电磁信号,受到外界的干扰。
- 网络世界是通过交换机,路由器组建起来的。而交换机,路由器就像十字路口一样,当某个时间点,实际转发的数据超过设备能转发的上限的时候,就会'堵车',造成丢包。
可靠传输:不是保证数据报 100% 到达,不造成一点丢失。而是尽可能提高传输成功的概率,如果丢包还会进行记录。
不可靠传输:在发出数据后就不管了。
3.3 面向字节流 vs 面向数据报
面向数据流:读写数据(读–>接收数据,写–> 发送数据)的时候,以字节为单位。支持读写任意长度,有粘包问题。 面向数据报:读写数据(读–>接收数据,写–> 发送数据)的时候,以一个数据报为单位。有长度限制。
3.4 通信模式
全双工:读写数据(读–>接收数据,写–> 发送数据),支持双向通信,能读能写。 半双工:只支持单向通信,要么读要么写。
四、UDP 数据报套接字编程
计算机中的文件通常是一个广义的概念,文件除了指代一些我们常说的文件外,还能指代一些硬件设备。操作系统管理硬件设备也是抽象成文件。
4.1 API 介绍
4.1.1 DatagramSocket 类
DatagramSocket 是 UDP Socket,用于发送和接收 UDP 数据报。
4.1.1.1 构造方法
| 方法签名 | 方法说明 |
|---|---|
| public DatagramSocket() throws SocketException | 创建一个 UDP 数据报套接字的 Socket,绑定到本机任意一个随机端口(一般用于客户端) |
| public DatagramSocket(int port) throws SocketException |


