UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
UDP的特征:
- 不需要建立连接,将数据及相关的地址都封装到数据包中
- 每个数据包的大小限制在64k
- 不需要建立连接,所以效率比较高,正因为不需要连接所以是不可靠协议
Socket
- Socket就是为网络服务提供的一种机制
- 通信的两端都有Socket
- 网络通讯其实就是Socket通信
- 数据在两个Socket间进行传输
Java中使用UDP的步骤
发送端
- 建立UDP的socket服务
- 封装数据包(指明接收端的IP地址,和接收端的端口号)
- 通过socket的Send()发送数据
- 关闭服务
接收端
- 创建socket服务(需要指明监视的端口号,并且要和发送端指定的接受端口的端口号一致)
- 定义数据包用于接收数据(构建DatagramPacket packet用于接收数据)
- 通过socket的Receiver()接受数据
- 通过packet提供的相应方法获取发送端发送的信息
- 关闭服务
代码案例如下
发送端
package cc.enfp.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
* UDP 发送端程序
*/
public class SendTest
{
public static void main(String[] args) throws IOException
{
/*
* 1、创建socket服务
*/
DatagramSocket socket = new DatagramSocket();
/*
* 2、提供相应的发送=信息
*/
byte[] data = "开启udp之旅".getBytes();
//指明接收端的IP地址,和接收端的端口号
DatagramPacket packet = new DatagramPacket(data, data.length,
InetAddress.getLocalHost(), 10000);
/*
* 3、使用socket的发送方法,进行数据的发送
*/
socket.send(packet);
/*
* 4、关闭连接,释放资源
*/
socket.close();
}
}
接收端
package cc.enfp.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
* UDP 接收端
*/
public class ReceiveTest
{
public static void main(String[] args) throws Exception
{
/*
* 1、创建socket服务
* 需要指明监视的端口号,并且要和发送端指定的接受端口的端口号一致
*/
DatagramSocket socket = new DatagramSocket(10000);
/*
* 2、构建DatagramPacket packet用于接收数据
* packet只是为了接受数据,所以只需要指明字节数组和长度就可以
*/
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
/*
* 3、通过socket的receive方法将数据封装到packet中
*/
socket.receive(packet);//该方法是阻塞
/*
* 4、通过packet提供的相应方法获取发送端发送的信息
*/
InetAddress ip = packet.getAddress();
System.out.println("发送端的IP: "+ip.getHostAddress());
//使用String的重载将返回的byte[]类型的内容转换成字符串
String content = new String(packet.getData(), 0, packet.getLength());
System.out.println("发送端发送的内容为: "+content);
/*
* 5.关闭连接,释放资源
*/
socket.close();
}
}