下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

如何用java组播MulticastSocket

作者:课课家教育     来源: http://www.kokojia.com点击数:1067发布时间: 2016-03-09 16:00:15

标签: Java语言Java编程Java开发

大神带你学编程,欢迎选课

  在单播模式中有客户端和服务器端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的。所以在编程模式上用同一个类表示即可——MulticastSocket。

如何用java组播MulticastSocket_Java语言_Java编程_课课家

  MulticastSocket属于JDk提供的类,类路径为java.NET.MulticastSocket,利用此类可以很方便地实现组播功能,下面展示一个简单例子,两个节点之间通过组播传输消息。

  ①节点一,指定同样的组播地址与端口,申请加入与节点一相同的组播组,接着通过循环不断接收来自其他节点发送的消息,通过MulticastSocket的receive方法可读到消息,将不断接收到来自节点一发送的消息“receive from node1:Hello from node1”。当然节点1也可以往组播组发送消息,因为每个节点都是同等的,只要其他节点对组播消息进行接收。如果你还想增加其他节点,尽管申请加入组播组,所有节点都可以接收发送消息。

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();
		}
	}
}

  ②节点二,指定组播地址为228.0.0.4,端口为8000,节点一通过调用MulticastSocket的joinGroup方法申请将节点一加入到组播队伍中,接着使用一个无限循环往组里发“Hello from node1”消息,这是为了方便节点1加入后接收节点2的消息做准备,需要说明的是组播是通过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();
        }
    }
}
赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程