socket(四)–组播
文章目录
一、简介
前面介绍的tcp和udp通信,都是点对点通信。这里介绍另一种通信方式,组播,在同一组内,发送的消息,所有组员都能接收到。
二、知识点
2.1 组播地址
d类地址,即224.0.0.0到239.255.255.255为组播地址。
其中:
- 224.0.0.0到224.0.0.255为预留地址;
- 224.0.1.0到238.255.255.255为组播地址,全网有效;
- 239.0.0.0到239.255.255.255为本地地址(类似192.168地址),仅特定的本地范围内有效,包只在本地子网中传播;
三、关键类
3.1 java.net.MulticastSocket
组播socket,常用方法有:
joinGroup(InetAddress mcastaddr):加入组播;
leaveGroup(InetAddress mcastaddr):离开组播;
setLoopbackMode(boolean disable):是否接收自身发出的消息,false:接收 true:不接收;
send(DatagramPacket p):发送消息;
receive(DatagramPacket p) :接收消息;
3.2 java.net.DatagramPacket
报文,同udp通信一样,只是发送地址填组播地址。
四、示例代码
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;
public class MulticastMain {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("239.0.0.1");
int port =6001;
MulticastSocket ms = new MulticastSocket(port); //端口,对于只发送而不接收消息的socket,可不设,由机器自动分配
//是否接收自己发出的消息,false:是 true:否
ms.setLoopbackMode(false);
//加入组播,离开组播用方法leaveGroup(InetAddress mcastaddr)
ms.joinGroup(group);
//新起接收消息线程
new ReadThread(ms).start();
Scanner scanner = new Scanner(System.in);
while (true) {
//发送消息
System.out.print("send msg:");
String msg = scanner.nextLine();
byte[] writeBytes = msg.getBytes();
//报文中指定发送组播地址
DatagramPacket writePacket = new DatagramPacket(writeBytes, writeBytes.length, group,port);
ms.send(writePacket);
}
}
/
* 接收消息线程
*/
public static class ReadThread extends Thread{
//组播socket
private MulticastSocket ms;
public ReadThread(MulticastSocket ms) {
this.ms = ms;
}
@Override
public void run() {
try{
while (true) {
//接收消息
byte[] readbytes = new byte[1024];
DatagramPacket readPacket = new DatagramPacket(readbytes,readbytes.length);
ms.receive(readPacket);
String readMsg = new String(readPacket.getData(), 0, readPacket.getLength());
System.out.println("receive msg:" + readMsg);
}
}catch (Exception e){
}
}
}
}