文章仅用作个人学习,原文链接:https://blog.csdn.net/qq_46331050/article/details/117706050
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象
基于UDP协议的通信双方而言,没有客户端和服务器概念
数据报是通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。数据报是完备的、独立的数据实体,该实体携带要从源计算机传递到目的计算机的信息,该信息不依赖以前在源计算机和目的计算机以及传输网络间交换。
UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)
我们在用Socket编程时,UDP协议要求包小于64K,TCP没有限定
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象
从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
Java提供了DatagramSocket类和DatagramPacket类
DatagramSocket:用于发送或接收数据包的套接字
DatagramPacket:数据包
此类表示用于发送和接收数据报数据包的套接字
数据报套接字是分组传送服务的发送或接收点
常用构造器 | 说明 |
---|---|
DatagramSocket() |
构造数据报套接字并将其绑定到本地主机上的任何可用端口 |
DatagramSocket(int port) |
构造数据报套接字并将其绑定到本地主机上的指定端口 |
常用方法 | 说明 |
---|---|
void send(DatagramPacket p) |
从此套接字发送数据报包 |
void receive(DatagramPacket p) |
从此套接字接收数据报包(阻塞式的接收) |
该类表示数据报包
数据报包用于实现无连接分组传送服务
常用构造器 | 说明 |
---|---|
(接收方) DatagramPacket(byte[] buf, int length) |
构造一个 DatagramPacket用于接收长度的数据包 length |
(发送方)DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) |
构造用于发送指定长度的数据报包到指定主机的指定端口号上 |
常用方法 | 说明 |
---|---|
int getLength() |
返回要发送的数据的长度或接收到的数据的长度 |
byte[] getData() |
返回数据缓冲区 |
创建发送端的Socket对象(DatagramSocket)。如果没有指定端口,发送到本地主机所有可用端口(不常用),这里可以采用指定端口构造方法 DatagramSocket()
,DatagramSocket(int port)
创建数据,并把数据封装成DatagramPacket包裹,数据一定要转成字节数组,同时需要指定IP地址和端口
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
调用DatagraSocket对象的方法发送数据包裹
void send(DatagramPacket p)
关闭发送端,释放资源 void close()
创建接收端的Socket对象(DatagramSocket),指定端口
DatagramSocket(int port)
准备容器,封装成DatagramPacket包裹,用于接收数据
DatagramPacket(byte[] buf, int length)
调用DatagramSocket对象的方法,阻塞式接收包裹
void receive(DatagramPacket p)
解析数据包,并把数据在控制台显示
byte[] getData() 和 int getLength()
关闭接收端,释放资源
void close()
同一台机器操作时,如果发送包裹的目的地端口和接收端的端口名不一致时,将会导致包裹丢失,接收不到数据
如果同一台机器下采用重复端口,会报错BindException: Address already in use: bind
端口重复使用
请注意,这一点尤为重要!!!
当写完接收和发送程序以后
一定要先启动接收程序,再启动发送程序发送数据,才能在接收端接收到发送的数据!!!