UDP
User Datagram Protocol
文章目录
Tips
- 类
DatagramSocket
和DatagramPacket
实现了基于 UDP 协议网络程序
与 TCP 区别
TCP | UDP |
---|---|
使用前,须先建立TCP连接,形成传输数据通道 | 将数据、源、目的封装成数据包,不需要建立连接 |
传输前“三次握手”,点对点通信 可靠的 | 发送 / 接收方 都不确认 不可靠的 |
在连接中可进行大数据量的传输 | 每个数据报的大小限制在64K内 |
进行通信的两个应用进程:客户端、服务端。 | 可以广播发送 |
传输完毕,需释放已建立的连接 效率低 | 发送数据结束时无需释放资源 开销小,速度快 |
无需建立连接原因:DatagramPacket 对象封装了UDP数据包,在数据包中包含了完整的地址信息
即发送端的IP 地址和端口号以及接收端的IP地址和端口号
因此无须建立发送方和接收方的连接。如同发快递包裹一样
实例化
DatagramSocket 类
DatagramSocket(int port)
:创建数据包套接字并将其绑定到本地主机上的指定端口
套接字将被绑定到通配符地址,IP 地址由内核来选择。DatagramSocket(int port,InetAddress laddr)
:创建数据包套接字,将其绑定到指定的本地地址。
本地端口必须处于 [0 ,65535]
如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地址,IP 地址由内核选择。
DatagramPacket类
DatagramPacket(byte[] buf,int length)
:构造 DatagramPacket,用来接收长度为 length 的数据包。 length ≤ buf.lengthDatagramPacket(byte[] buf,int length,InetAddress address,int port)
:构造数据包,用来将长度为 length 的包发送到指定主机上的指定端口号。length ≤ buf.length
发送端
public void sender() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我是UDP方式发送的导弹";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getLocalHost();
//数据打包
DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
//发送
socket.send(packet);
//关闭
接收端
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
//数据打包
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
//发送
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
//关闭
socket.close();
}
常用方法
DatagramSocket 类
void
close()
:关闭此数据包套接字。void
send(DatagramPacket p)
:从此套接字发送数据包。
包含的信息:将要发送的数据、其长度、远程主机的IP 和端口号。void
receive(DatagramPacket p)
:从此套接字接收数据包。
当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据,数据包也包含发送方的 IP 和端口号。
此方法在接收到数据包前一直阻塞。
如果信息比包的长度长,该信息将被截短。InetAddress
getLocalAddress()
:获取套接字绑定的本地地址。int
getLocalPort()
:返回此套接字绑定的本地主机上的端口号。InetAddress
getInetAddress()
:返回此套接字连接的地址。如果未连接,则返回null。int
getPort()
:返回此套接字的端口。如果未连接,则返回-1。
DatagramPacket类
InetAddress
getAddress()
:返回某台机器的 IP 地址,此数据包将要发往该机器或者是从该机器接收到的。int
getPort()
:返回某台远程主机的端口号,此数据包将要发往该主机或者是从该主机接收到的。byte[]
getData()
:返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。int
getLength()
:返回将要发送或接收到的数据的长度。