在單播模式中有服務器端和客戶端之分,而組播模式與單播模式不同,每個端都是以路由器或交換機做為中轉廣播站,任意一端向路由器或交換機發送消息,路由或交換機負責發送其他節點,每個節點都是同等的。所以在編程模式上用同一個類表示即可——MulticastSocket。
MulticastSocket屬于jdk提供的類,類路徑為java.net.MulticastSocket,利用此類可以很方便地實現組播功能,下面展示一個簡單例子,兩個節點之間通過組播傳輸消息。
①節點一,指定組播地址為228.0.0.4,端口為8000,節點一通過調用MulticastSocket的joinGroup方法申請將節點一加入到組播隊伍中,接著使用一個無限循環往組里發“Hello?from?node1”消息,這是為了方便節點2加入后接收節點1的消息做準備,需要說明的是組播是通過DatagramPacket對象發送消息的,調用MulticastSocket的send方法即可把消息發送出去。這里為了縮減例子長度省去了退出組及關閉套接字的一些操作,實際使用中需完善。
~~~
public?class?Node1?{
private?static?int?port?=?8000;
private?static?String?address?=?"228.0.0.4";
public?static?void?main(String[]?args)?throws?Exception?{
try?{
InetAddress?group?=?InetAddress.getByName(address);?
MulticastSocket?mss?=?null;
mss?=?new?MulticastSocket(port);
mss.joinGroup(group);
while?(true)?{
String?message?=?"Hello?from?node1";
byte[]?buffer?=?message.getBytes();?
DatagramPacket?dp?=?new?DatagramPacket(buffer,?buffer.length,
group,?port);
mss.send(dp);?
Thread.sleep(1000);
}
}?catch?(IOException?e)?{
e.printStackTrace();
}?
}
}
~~~
②節點二,指定同樣的組播地址與端口,申請加入與節點一相同的組播組,接著通過循環不斷接收來自其他節點發送的消息,通過MulticastSocket的receive方法可讀到消息,將不斷接收到來自節點一發送的消息“receive?from?node1:Hello?from?node1”。當然節點2也可以往組播組發送消息,因為每個節點都是同等的,只要其他節點對組播消息進行接收。如果你還想增加其他節點,盡管申請加入組播組,所有節點都可以接收發送消息。
~~~
public?class?Node2?{
private?static?int?port?=?8000;
private?static?String?address?=?"228.0.0.4";
public?static?void?main(String[]?args)?throws?Exception?{
InetAddress?group?=?InetAddress.getByName(address);?
MulticastSocket?msr?=?null;
try?{
msr?=?new?MulticastSocket(port);
msr.joinGroup(group);
byte[]?buffer?=?new?byte[1024];
while?(true)?{
DatagramPacket?dp?=?new?DatagramPacket(buffer,?buffer.length);?
msr.receive(dp);?
String?s?=?new?String(dp.getData(),?0,?dp.getLength());?
System.out.println("receive?from?node1:"+s);
}
}?catch?(IOException?e)?{
e.printStackTrace();
}?
}
}
~~~