多播(组播)与广播的技术实现
1、组播是基于路由器之上实现的,要想网络内支持组播,需要有能够管理组播组的路由器或是三层交换机(带部分路由功能的交换机)。通常在我们的网络中,都会支持组播,即我们的程序可以使用组播技术,视频会议就使用这个技术。
2、IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。通常选择230之后的地址,使用UDP协议,把每个客户端(收端和发端)的socket都加入到这个地址上,之后客户端往这个地址上发送一个消息后,在这个组里的其他客户端都可以监听收到这个消息。
3、在java中,java.net.MulticastSocket具有组播的功能,它是DatagramSocket的子类。具体程序如下:
package com.udpdemo.multicast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ServerMulticastSocketTest { public static void main(String[] args) { // TODO Auto-generated method stub MulticastSocket multicastSocket; try { multicastSocket = new MulticastSocket(); InetAddress address = InetAddress.getByName("239.0.0.1"); // 必须使用D类地址 multicastSocket.joinGroup(address); // 以D类地址为标识,加入同一个组才能实现广播 while (true) { String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); byte[] buf = time.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); datagramPacket.setAddress(address); // 接收地址和group的标识相同 datagramPacket.setPort(10000); // 发送至的端口号 multicastSocket.send(datagramPacket); Thread.sleep(1000); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.udpdemo.multicast; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class ClientMulticastSocketTest { public static void main(String[] args) { // TODO Auto-generated method stub MulticastSocket multicastSocket; try { multicastSocket = new MulticastSocket(10000); InetAddress address = InetAddress.getByName("239.0.0.1"); multicastSocket.joinGroup(address); byte[] buf = new byte[1024]; while (true) { DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); multicastSocket.receive(datagramPacket); // 接收数据,同样会进入阻塞状态 byte[] message = new byte[datagramPacket.getLength()]; // 从buffer中截取收到的数据 System.arraycopy(buf, 0, message, 0, datagramPacket.getLength()); System.out.println(datagramPacket.getAddress()); System.out.println(new String(message)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 接收数据时需要指定监听的端口号 } }
关于MulticastSocket中的setTimeToLive方法:
4、广播功能:
使用255.255.255.255(或者是192.168.10.255,具体ip地址上设置第四个参数为255是本网段的广播地址)的IP地址,所有的客户端都监听这个地址,发这个地址上发送消息,其他的客户端都会接收到。
java中使用java.net.DatagramSocket来完成监听和发送,发送信息前,要开启广播,即调用socket的setbroadcast(true)。
发送端Socket:
void init_uSock(String sendText) throws Exception{ uSock = new DatagramSocket(); InetAddress host = InetAddress.getByName("192.168.10.255"); byte[] data = sendText.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, host, office.local_udp_port); uSock.setBroadcast(true); uSock.send(packet); Log.e("UDP", "发送"); }
接收端Socket:
InetAddress addr = InetAddress.getByName("192.168.10.255"); DatagramSocket uServ = new DatagramSocket(office.local_udp_port,addr); while (uWork) { DatagramPacket packet = new DatagramPacket(new byte[102400], 102400); uServ.receive(packet); ............. }