UDP协议介绍
1.UDP是一种无连接、不可靠传输的协议;
2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ;
3.每个数据包的大小限制在64KB内;
4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;
5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快;
UDP协议通信场景
语音通话,视频会话等。
UDP协议通信模型演示
数据包对象、数据包
DatagramPacket:数据包对象
构造器
常用方法
DatagramSocket:发送端和接收端对象
构造器
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建发送端的Socket对象,系统会随机分配一个端口号 |
public DatagramSocket(int port) | 创建接收端的Socket对象并指定端口号 |
常用方法
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive(DatagramPacket p) | 接收数据包 |
单播:一对一、多对一
单台主机与单台主机之间的通信。
要使接收端同时接收多台设备的消息,只需接收端保持运行状态,多个发送端都填写正确的接收端地址和端口即可。
发送端实现步骤
代码示例
public class ClientDemo1 {
public static void main(String[] args) throws Exception {
System.out.println("=====客户端启动======");
// 1、创建发送端对象:发送端自带默认的端口号
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
if("exit".equals(msg)){
System.out.println("离线成功!");
socket.close();
break;
}
// 2、创建一个数据包对象封装数据
byte[] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,InetAddress.getLocalHost() , 8888);
// 3、发送数据出去
socket.send(packet);
}
socket.close();
}
}
接收端实现步骤
代码示例
public class ServerDemo2 {
public static void main(String[] args) throws Exception {
System.out.println("=====服务端启动======");
// 1、创建接收端对象:注册端口
DatagramSocket socket = new DatagramSocket(8888);
// 2、创建一个数据包对象接收数据
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
// 3、等待接收数据。
socket.receive(packet);
// 4、取出数据即可
// 读取多少倒出多少
int len = packet.getLength();
String rs = new String(buffer,0, len);
System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
}
}
}
广播:一对多通讯
当前主机与所在网络中的所有主机通信。
UDP如何实现广播
使用广播地址:255.255.255.255
具体操作
1.发送端发送的数据包的目的地写的是广播地址、且指定端口;
2.本机所在网段的其他主机的程序只要注册对应端口即可;
发送端代码示例
public class client {
public static void main(String[] args) throws Exception {
System.out.println("=====发送端启动======");
// 1、创建发送端对象:发送端自带默认的端口号
DatagramSocket socket=new DatagramSocket();
// 2、创建一个数据包对象封装数据
byte[] buffer="UDP广播测试".getBytes();
只要目的地IP是 255.255.255.255 这个消息将以广播的形式对外发送
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("255.255.255.255"),9999);
// 3、发送数据出去
socket.send(packet);
socket.close();
}
}
接收端代码示例
public class serve {
public static void main(String[] args) throws Exception {
System.out.println("=====接收端启动======");
// 1.创建一个接受端对象,注册端口
DatagramSocket socket=new DatagramSocket(9999);
// 2.创建一个数据包对象,封装接受的数据
byte[] buffer=new byte[1024*64];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
//3.等待接收消息
socket.receive(packet);
//4.打印接收的内容
int len=packet.getLength();
String rs=new String(buffer,0,len);
System.out.println("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");
System.out.println("消息内容:"+rs);
socket.close();
}
}
组播:一对多通讯
当前主机与选定的一组主机的通信。
UDP如何实现组播
使用组播地址:224.0.0.0(不含) ~ 239.255.255.255(含)
。
具体操作
1.发送端的数据包的目的地是组播IP (例如:224.0.1.1, 端口:9999);
2.接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息;
3.DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP;
所在网段的其他主机注册了该组播IP和对应端口即可接收消息
发送端代码示例
public class client {
public static void main(String[] args) throws Exception {
System.out.println("=====发送端启动======");
// 1、创建发送端对象:发送端自带默认的端口号
DatagramSocket socket=new DatagramSocket();
// 2、创建一个数据包对象封装数据
byte[] buffer="123".getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("224.0.1.1"),9999);
// 3、发送数据出去
socket.send(packet);
socket.close();
}
}
接收端代码示例
public class serve {
public static void main(String[] args) throws Exception {
System.out.println("=====接收端启动======");
// 1.创建一个接受端对象,注册端口
MulticastSocket socket=new MulticastSocket(9999);
//把当前接收端加入到一个组播中,绑定对应的组播消息IP
// socket.joinGroup(InetAddress.getByName("224.0.1.1"));
//新绑定方法
socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"),9999), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
// 2.创建一个数据包对象,封装接受的数据
byte[] buffer=new byte[1024*64];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
//3.等待接收消息
socket.receive(packet);
//4.打印接收的内容
int len=packet.getLength();
String rs=new String(buffer,0,len);
System.out.println("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");
System.out.println("消息内容:"+rs);
socket.close();
}
}
}
今天的文章Java UDP通信详解:单播、广播、组播分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26152.html