使用UDP通信方式开发接收端和发送端(模拟视频弹幕系统)
分析:发送端可以一直发送消息 接收端可以不断的接收多个发送端的消息展示 发送端输入exit则结束发送端程序
UDP的接收端为什么可以接收很多发送端的消息 ?
接收端只负责接收数据包,无所谓是哪个发送端的数据包
服务端(接收端)先启动
package UDP多发多收;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("接收端");
// 创建接收端对象
DatagramSocket ds=new DatagramSocket(2345);
//创建字节数组装内容
byte[] arr=new byte[1024*64];
//创建接收包
DatagramPacket dp=new DatagramPacket(arr, arr.length);
while (true) {
ds.receive(dp);
int len = dp.getLength();//记录实际长度
String s = new String(arr, 0, len);
System.out.println("来自ip为:" + dp.getAddress() + "端口号为:" + dp.getPort() + "的信息:" + s);
}
}
}
客户端(发送端)
package UDP多发多收;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
System.out.println("------发送端-----");
// 创建发送端对象
DatagramSocket ds=new DatagramSocket(2222); //系统会随机分端口,也可以直接设置
//使用扫描器接收用户输入
Scanner sc=new Scanner(System.in);
while(true) {
System.out.println("(输入exit退出)请你输入数据:");
String s=sc.nextLine();
if("exit".equals(s)) {
System.out.println("退出系统");
ds.close();//关闭资源
}
byte[] arr=s.getBytes(); //直接打成字节数组
//创建数据包对象
DatagramPacket dp=new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 2345);
ds.send(dp);//开始发送
}
}
}
UDP通信-广播、组播
UDP的三种通信方式
单播:单台主机与单台主机之间的通信
广播:当前主机与所以网络中的索引主机通信
组播:当前主机与选择的一组主机的通信
UDP如何实现广播
使用广播地址255.255.255.255
具体操作:
1发送端发送的数据包的目的地写的是广播地址、且指定端口(255.255.255.255 , 端口号)
2本机所在网段的其他主机的程序只要匹配端口成功就可以接收消息了。(端口号)
InetAddress.getName("255.255.255.255")
UDP如何实现组播
使用组播地址224.0.0.0到239.255.255.255
具体操作
发送端的数据包目的地是组播ip(例如224.0.1.1 端口9999)
接收端必须绑定组播ip(224.0.1.1) 端口还要对应发送端的端口9999 ,这样即可接收组播消息
DatagramSocket的子类MulticaseSocket可以在接收端绑定组播ip
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
public class Test {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
MulticastSocket mcs=new MulticastSocket();
//mcs.joinGroup("224.0.0.1"); 从JDK14开始已经过时了
mcs.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"), 9999),NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
}
}