网络通信中的单播、广播和组播的实现

网络访问

目前网络访问分为单播、广播和组播,以下将介绍其Java实现。

单播

单播就是点对点的通信,如下图所示:
这里写图片描述

实现

单播服务端

public class SingleServer extends Thread{

    public void run(){
        try {
            int port = 30000;
            byte[] buffer = new byte[1024];
            DatagramSocket server = new DatagramSocket(port);
            DatagramPacket recivePacket = new DatagramPacket(buffer,buffer.length);

            while(true){
                server.receive(recivePacket);
                String str = new String(buffer,0,recivePacket.getLength());
                System.out.println("SingleServer接收到的:"+str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

单播客户端

public class SingleClient extends Thread{

    public void run(){
        try{
            String str = "要发送的数据";
            int port = 30000;
            DatagramSocket client = new DatagramSocket();

            SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);
            DatagramPacket sendPacket = new DatagramPacket(str.getBytes(),str.getBytes().length,address);

            client.send(sendPacket);
            client.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

广播

广播就是对一个网络中的所有主机发送数据包,如下图所示:
这里写图片描述

实现

广播服务端,和单播的服务端一样。

public class BroadcastServer extends Thread{

    public void run(){
        try {
            int port = 30000;
            byte[] buffer = new byte[1024];
            DatagramSocket server = new DatagramSocket(port);
            DatagramPacket recivePacket = new DatagramPacket(buffer,buffer.length);

            while(true){
                server.receive(recivePacket);
                String str = new String(buffer,0,recivePacket.getLength());
                System.out.println("BroadcastServer接收到的:"+str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

广播客户端,和单播的客户端的区别是,发送的host地址为“255.255.255.255”广播地址。

public class BroadcastClient extends Thread{

    public void run(){
        try{
            String str = "要发送的数据";
            String host = "255.255.255.255";
            int port = 30000;
            DatagramSocket client = new DatagramSocket();

            SocketAddress address = new InetSocketAddress(InetAddress.getByName(host),port);
            DatagramPacket sendPacket = new DatagramPacket(str.getBytes(),str.getBytes().length,address);

            client.send(sendPacket);
            client.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

组播

组播就是对一个组里面的所有主机广播,如下图所示:
这里写图片描述

实现

组播的服务端,预先定义一个组播地址,然后加入到组中。组播地址必须和客户端一样,才能够接收到客户端发送的信息。

public class MulticastServer extends Thread{

    public void run(){
        try {
            byte[] buffer = new byte[1024];
            int port = 30000;
            InetAddress address = InetAddress.getByName("230.0.0.1");

            DatagramPacket recivePacket = new DatagramPacket(buffer,buffer.length);

            MulticastSocket server = new MulticastSocket(port);
            server.joinGroup(address);//需要join到组播地址,否则收不到组播信息

            while(true){
                server.receive(recivePacket);
                String str = new String(buffer,0,recivePacket.getLength());
                System.out.println("MulticastServer接收到的:"+str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

组播客户端,组播地址和服务端一样

public class MulticastClient extends Thread{

    public void run(){
        try{
            String str = "要发送的数据";
            int port = 30000;
            InetAddress address = InetAddress.getByName("230.0.0.1");
            MulticastSocket client = new MulticastSocket();
            client.joinGroup(address);

            DatagramPacket sendPacket = new DatagramPacket(str.getBytes(),str.getBytes().length,address,port);

            client.send(sendPacket);
            client.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值