前言
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)
。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
此代码就是基于UDP协议编写。
通常把一对多的通信称为多播通信。采用多播通信技术,不仅可以实现一个发送者和多个接收者之间进行通信的功能,而且可以有效减轻网络通信的负担,避免资源的无谓浪费。
UDP组播地址:224.0.0.0 ~ 224.0.0.255
组播有一个特点,就是你发送地址可以使用一个端口,但是你接收地址也可以使用同样的一个端口。
数据发送
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;
public class SendDataDemo {
public static void main(String[] args) throws IOException {
/* 组播 */
Scanner in=new Scanner(System.in);
MulticastSocket ms=new MulticastSocket();
System.out.println("请输入用户名");
String name=in.next()+":";
new MyThread().start();
while(true){
String target=name+in.next();
if("886".equals(target)) { break; }
byte[] bytes = target.getBytes();
InetAddress inetAddress = InetAddress.getByName("224.0.0.0");
int port=11451;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inetAddress,port);
ms.send(dp); // 发送
}
System.out.println("主线程退出");
ms.close();
}
}
数据接收线程
import java.io.IOException;
import java.net.*;
public class MyThread extends Thread{
@Override
public void run() {
MulticastSocket ms= null; // 指定接收端口
try {
ms = new MulticastSocket(11451);
InetAddress inetAddress = InetAddress.getByName("224.0.0.0"); // 指定组播地址
ms.joinGroup(inetAddress); // 将当前接收端加入组播
} catch (IOException e) {
throw new RuntimeException(e);
}
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
while(true){
try {
ms.receive(dp); // 接收数据
} catch (IOException e) {
throw new RuntimeException(e);
}
int len = dp.getLength(); // 获取接收数据的长度
byte[] data = dp.getData(); // 获取存储接收数据的数组
String res = new String(data, 0, len);
if("886".equals(res)) { break; }
System.out.println(res);
}
System.out.println("输出线程退出");
}
}