目录
1. 网络编程基础
1.1 网络编程定义
1.2 网络编程中的基本概念
1.2.1 API
1.2.2.发送端和接收端
1.2.3 请求和响应
1.2.4 客户端和服务端
2. Socket 套接字
2.1 概念
2.2 分类
3. UDP数据报套接字编程
3.1 DatagramSocket API
3.1.1 含义
3.1.2 构造方法
3.1.3 常用方法
3.2 DatagramPacket API
3.2.1 含义
3.2.2 构造方法
3.2.3 常用方法
网络编程是指网络上的主机,通过不同的进程,以编程的方式实现网路通信(或称为网络数据传输);
1. 进行网络编程时,需要操作系统提供的API才能实现编程;
2. API可以认为是应用层与传输层之间交互的路径;
3. 用于网络编程的API称为Socket API;
发送端:数据的发送方进程,发送端主机即网络通信中的源主机;
接收端:数据的接收方进程,接收端主机即网络通信中的目的主机;
发送端和接收端是相对的,只是一次网络数据传输产生数据流向后的概念;
一般来说获取一个网络资源,涉及到两次网络数据传输:
第1次:请求数据的发送;
第2次:响应数据的发送;
服务端:在常见的网络数据传输场景下,把提供服务的一方进程称为服务端,可以提供对外服务;
客户端:获取服务的一方进程称为客户端;
对于服务来说,一般是提供:
(1)客户端获取服务资源;
(2)服务器保存客户端资源;
1. Socket套接字是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。
2. socket是操作系统中的一个概念,本质上是一种特殊的文件,Socket是将网卡抽象为文件,向socket文件中写数据,就相当于通过网卡发送数据,从socket文件读数据,就相当于通过网卡接收数据,从而实现了网络通信和文件操作的统一。
socket API是与传输层密切相关的,传输层提供了两个最核心的协议:UDP和TCP,
因此socket也提供了两种风格:UDP风格与TCP风格;
TCP:有连接(需要建立连接才能通信,如打电话)、可靠传输(发送方明确消息是否发送成功,如有已读标志的社交软件),面向字节流(数据传输的基本单位是字节),全双工(同上);
UDP:无连接(无需建立连接才能通信,如发短信)、不可靠传输(只负责传输,不论是否传输成功,如QQ、微信)、面向数据报(数据传输的基本单位是数据报,具有严格格式,可能是若干个字节),全双工(双向同时通信);
注:(1)在计算机中,抽象的连接是很常见的,连接本质上就是建立连接的双方各自保存对方的信息,故而对于无连接的UDP,需要程序员调用UDP的socket api时把对方的位置等信息发送过去。
(2)网络通信数据的基本单位涉及到多种说法,包括数据报(Datagram)、数据包(Packet)、数据帧(Frame)、数据段(Segment);
Datagram表示网卡的一个特殊文件,使用这个类表示一个socket对象,在操作系统中将这个socket对象当做一个文件来处理,相当于是文件描述符表上的一项:
注:① 普通文件对应的硬件设备是硬盘,socket对象对应的硬件设备是网卡;
② 一个socket对象即可与另一台主机进行通信了,如需与多台主机通信,需创建多个socket对象;
③ 在Java中就使用DatagramSocket类表示系统内部的socket文件;
// 创建一个socket对象
DatagramSocket();
// 传入一个端口号,令当前的socket对象与指定的端口(简单整数)关联起来
DatagramSocket(int port);
注:① 端口号用于标识主机上的不同应用程序;
② 本质上说,并非进程与端口建立联系,而是进程中的socket对象与端口建立联系;
③ 对于第一种没有传入指定端口号的构造方法,系统会自动分配一个空闲端口;
//接收
void receive(DatagramPacket p);
//发送
void send(DatagramPacket p);
//关闭
void close()
注:① 用于接收和发送的都是DatagramPacket对象;
② 接收方法中的DatagramPacket对象p相当于是一个空对象,receive方法内部会对参数的这个空对象进行内容填充(数据来自网卡),从而构造出一个结果数据,参数是一个输出型参数;
③类似于文件操作,使用完后需要使用close方法进行资源的释放;
1. DatagramPacket表示一个UDP的数据报,包含一些具体数据;
2. UDP传输是面向数据报的,每次进行传输时以UDP数据报为基本单位;
// 构造buf缓冲区
DatagramPacket(byte[] buf, int length);
// 构造缓冲区与地址,SocketAddress表示IP+端口号
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address);
注:① 构造DatagramPacket对象时可以指定一些具体的数据,如字节数组缓冲区,地址;
② byte[]数组:
// 从接收的数据报中获取发送端主机的IP地址或从发送的数据报中获取接收端主机的IP地址
InetAddress getAddress();
// 从接收的数据报中获取发送端主机的端口号或从发送的数据报中获取接收端主机的端口号
int getPort();
// 获取数据报中的数据
byte[] getData();