1. 网络编程基础
为什么要进行网络编程呢?我们进行网络通信就是为了获取丰富的网络资源。通过网络,我们可以访问世界上成千上万的人制作的网络资源,甚至看到一辈子都看不到的景色。这些资源本质上都是二进制资源或者是文本资源,我们通过网络可以让很多人来访问,这就是网络编程。
**网络编程的概念:**网络上的主机,通过不同的进程,以编程的方式实现网络通信;
同一个主机下的不同进程实现网络通信也是网络编程;
网络编程的基本概念:
- **接收端:**数据接收端进程,目标主机;
- **发送端:**数据发送端进程,源主机;
- **收发端:**发送接收两端;
- **请求:**请求数据的发送;
- **响应:**响应数据的发送;
- **服务端:**提供服务的一方,返回服务资源;
- **客户端:**获取服务的一方;
2. Socket 套接字
Socket 就是套接字,是由系统提供用于网络通信的技术,是基于 TCP/IP 协议的网络通信的基本单元,基于 Socket 套接字的网络程序开发就是网络编程;
Socket 套接字主要针对传输层协议划分为三类(本文重点讲解两个核心协议):
- **TCP:**有连接,可靠传输,面向字节流,全双工;
- **UDP:**无连接,不可靠传输,面向数据报,全双工;
这里的有连接和无连接都是抽象的概念,虚拟上的连接。
TCP 协议保存了对端的信息,A 和 B 通信,A 和 B 先建立连接,A 保存了 B 的信息,B 也保存了 A 的信息,他们彼此都知道谁与自己建立的连接,而 UDP 不保存对方的信息;
可靠传输和不可靠传输是什么呢?
网络上,数据的传输是会发生丢包的情况的,可能会受到外界的干扰,那么可靠传输就能避免这样的丢包吗?事实上是不能的,可靠传输只是保证尽可能提高传输成功的概率,如果出现了丢包,也能感知到。不可靠传输的话就是把数据发送之后就不管了。那么这样的话我们就使用可靠传输就好了呀,还要 UDP 干嘛呢?凡是必有代价,UDP 的话速度会更快;
面向字节流和面向数据报呢?
- **面向字节流:**读写数据的时候,以字节为单位;
- **面向数据报:**读写数据的时候,以一个数据报为单位;
全双工和半双工呢?
- **全双工:**一个通信联络,能读也能写;
- **半双工:**只支持单向通信,要么读,要么写;
我们使用 Socket API 来进行网络编程,我们之前提到计算机中的'文件'有狭义和广义的概念,硬件设备可以抽象成文件,统一管理;电脑上的网卡就是 Socket 文件;
3. UDP 数据报套接字编程
我们先来介绍 UDP 需要的 API:
DatagramSocket
UDP 的 Socket 用于接收和发送 UDP 数据报;
构造方法:
| 方法签名 | 方法说明 |
|---|---|
| DatagramSocket() | 创建一个 UDP 数据报套接字的 Socket,绑定到本机任意一个端口,一般用于客户端 |
| DatagramSocket(int port) | 创建一个 UDP 数据报套接字的 Socket,绑定到本机指定的端口,一般用于服务端 |
方法:
| 方法签名 | 方法说明 |
|---|---|
| void receive(DatagramPacket p) | 从此套接字接收数据报,如果没有收到数据报就会阻塞等待; |
| void send(DatagramPacket p) | 从此套接字发送数据报,不会阻塞等待,直接发送; |
| void close() | 关闭此数据报套接字 |


