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

来源:互联网 发布:chrome缓存文件夹 mac 编辑:程序博客网 时间:2024/06/05 10:31

网络访问

目前网络访问分为单播、广播和组播,以下将介绍其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();        }    }}
0 0