java使用MulticastSocket實現(xiàn)組播
組播是一種允許源進程將數(shù)據(jù)包發(fā)送到多個目標進程的網(wǎng)絡技術。組播源將數(shù)據(jù)包發(fā)送到特定組播組,只有屬于該組播組的進程才能接收到數(shù)據(jù)包。這些進程可以是在同一個物理網(wǎng)絡,也可以來自不同的物理網(wǎng)絡(只要有組播路由器支持)。
組播分為無連接和面向連接組播,但是基本的組播機制是無連接的,我們這里所講的也是無連接組播。
我們說過使用MulticastSocket類,這個類叫組播數(shù)據(jù)報套接字類,主要用來發(fā)送和接收IP組播報文。MulticastSocket是DatagramSocket的子類,它增加了加入和離開組播組的功能。組播組通過一個D類IP地址和一個標準UDP端口號的組合來定義。D類IP地址的范圍是224.0.0.0~239.255.255.255,除了224.0.0.0是保留地址,不應使用。
下面我們用一個簡單的示例演示兩個進程如何使用組播進行通信,這兩個進程一個是發(fā)送端進程,另一個是接收端進程。
我們看代碼:
Sender.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Sender {
public static void main(String[] args) {
try {
byte[] msg = new byte[] { 'h', 'e', 'l', 'l', 'o' };
InetAddress inetAddress = InetAddress.getByName("230.0.0.1");//根據(jù)主機名返回主機的IP地址
DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length, inetAddress, 7777);//數(shù)據(jù)包包含消息內(nèi)容,消息長度,組播IP和端口
MulticastSocket multicastSocket = new MulticastSocket();
multicastSocket.send(datagramPacket);//發(fā)送數(shù)據(jù)包
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
Receiver.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Receiver {
public static void main(String[] arstring) {
try {
MulticastSocket multicastSocket = new MulticastSocket(7777);//創(chuàng)建組播套接字并綁定到發(fā)送端口
InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
multicastSocket.joinGroup(inetAddress);//組播套接字加入組播組
while (true) {
byte[] data = new byte[100];
DatagramPacket datagramPacket = new DatagramPacket(data,data.length);//創(chuàng)建一個用于接收數(shù)據(jù)的數(shù)據(jù)包
multicastSocket.receive(datagramPacket);//接收數(shù)據(jù)包
System.out.println(new String(data));
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
使用MulticastSocket實現(xiàn)組播的要點如下:
接收方:加入組播組;
發(fā)送方:發(fā)送包含組地址的數(shù)據(jù)報。
順便提一下組播實現(xiàn)私信的做法:我們可以在消息頭部加上指定接收者地址,然后使用組播的方式發(fā)送,關鍵在接收的時候檢查該地址,如果跟匹配該地址,就接收并處理;如果不匹配當然就拋棄。當然這明顯有安全問題,以后找到解決辦法或者單播機制再另寫一篇博文了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
圖文講解IDEA中根據(jù)數(shù)據(jù)庫自動生成實體類
這篇文章主要以圖文講解IDEA中根據(jù)數(shù)據(jù)庫自動生成實體類,本文主要以Mysql數(shù)據(jù)庫為例,應該會對大家有所幫助,如果有錯誤的地方,還望指正2023-03-03

