如何用java组播MulticastSocket

    作者:课课家教育更新于: 2016-03-09 16:00:15

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

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

课课家教育

未登录

1