说明
组播的代码,与单播、广播不同,使用 MulticastSocket 类实现
https://info.support.huawei.com/info-finder/encyclopedia/zh/%E7%BB%84%E6%92%AD.html#content3
https://blog.csdn.net/m0_51551385/article/details/122327966
组播地址
224.0.0.0~224.0.0.255:为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用224.0.1.0~224.0.1.255:是公用组播地址,可以用于Internet224.0.2.0~238.255.255.255:为用户可用的组播地址(临时组地址),全网范围内有效239.0.0.0~239.255.255.255:为本地管理组播地址,仅在特定的本地范围内有效
代码
package udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
/**
*
*
* 编写一个聊天的工具
* 有收数据部分,和发数据部分
* 这两个不部分同时执行
* 就需要多线程技术
* 一个线程控制收,一个线程控制发
*
* 因为收和发动作是不一致的,所以要定义两个方法
* 而且这两个方法要封装到不同的类中
*
* @author 言曌
* @date 2017/12/6 下午8:25
*/
class Send2 implements Runnable {
private MulticastSocket socket;
public Send2(MulticastSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
InetAddress group = InetAddress.getByName("228.5.6.7");
socket.joinGroup(group);
String line = null;
while((line = reader.readLine())!= null) {
byte[] buff = line.getBytes();
DatagramPacket packet = new DatagramPacket(buff,buff.length,group,6789);
socket.send(packet);
if("bey".equals(line)) {
break;
}
}
socket.close();
} catch (IOException e) {
throw new RuntimeException("发送端失败");
}
}
}
class Rece2 implements Runnable {
private MulticastSocket socket;
public Rece2(MulticastSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
byte[] buff = new byte[1024];
InetAddress group = InetAddress.getByName("228.5.6.7");
socket.joinGroup(group);
while(true) {
DatagramPacket packet = new DatagramPacket(buff,buff.length);
socket.receive(packet);
String data = new String(packet.getData(),0,packet.getLength());
String ip = packet.getAddress().getHostAddress();
if("bye".equals(data)) {
System.out.println(ip+"离开了");
continue;
}
System.out.println("ip:"+ip+" 说:"+data);
}
} catch (IOException e) {
throw new RuntimeException("接受端失败");
}
}
}
public class ChatDemo2 {
public static void main(String args[]) throws IOException {
MulticastSocket sendSocket = new MulticastSocket();
MulticastSocket receSocket = new MulticastSocket(6789);
new Thread(new Send2(sendSocket)).start();
new Thread(new Rece2(receSocket)).start();
}
}