socket(四)–组播

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){
            }
        }
    }
}
发布了274 篇原创文章 · 获赞 95 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/chinabestchina/article/details/105037404