IP多點廣播原理
設置一組特殊網絡地址作為多點廣播地址,每一個多點廣播地址都被看作一個組,當客戶需要發送和接受信息時,加入到該組即可。
IP協議為多點廣播提供了一批特殊的IP地址,范圍是224.0.0.0 ~ 239.255.255.255
JAVA中使用MutilcastSocket加入一個廣播組(joinGroup),從而在組內發送和接受數據報DatagramPacket。
MutilcastSocket比起普通的UDP通信的DatagramSocket多了setTimeToLive(int ttl),參數ttl決定廣播組的范圍,默認為1,表示局域網。
下面是一個簡單例子,BroadcastSocket中用一個線程接收鍵盤輸入(因為會阻塞)並使用MutilcastSocket發送數據,
用另一個線程從MutilcastSocket讀取數據並打印出來,
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.InetAddress; 6 import java.net.MulticastSocket; 7 import java.util.Scanner; 8 9 public class BroadcastSocket implements Runnable{ 10 private static final String BROADCAST_IP = "230.0.0.1"; 11 public static final int BROADCAST_PORT = 3000; 12 private static final int DATA_LEN = 4096; 13 private MulticastSocket socket = null; 14 private InetAddress broadcastAddress = null; 15 //用來接收鍵盤輸入 16 private Scanner scan = null; 17 //用來接收網絡字節 18 byte[] inBuff = new byte[DATA_LEN]; 19 //用將inBuff封裝進DatagramPacket 20 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length); 21 //封裝發送數據的DatagramPacket 22 private DatagramPacket outPacket = null; 23 public void init() throws IOException { 24 try { 25 Scanner scan = new Scanner(System.in); 26 socket = new MulticastSocket(BROADCAST_PORT); 27 broadcastAddress = InetAddress.getByName(BROADCAST_IP); 28 socket.joinGroup(broadcastAddress); 29 //設置本是否阻止MulticastSocket會發送給自身, true表示阻止 30 socket.setLoopbackMode(false); 31 //初始化outPacket 32 outPacket = new DatagramPacket(new byte[0], 0 , broadcastAddress, BROADCAST_PORT); 33 new Thread(this).start(); 34 //讀取鍵盤輸入 35 while (scan.hasNextLine()) { 36 //需要先將鍵盤輸入轉為byte字節才能設置DatagramPacket的值 37 byte[] buff = scan.nextLine().getBytes(); 38 outPacket.setData(buff); 39 socket.send(outPacket); 40 } 41 } finally { 42 socket.close(); 43 } 44 } 45 @Override 46 public void run() { 47 try { 48 while (true) { 49 socket.receive(inPacket); 50 System.out.println("聊天信息:"+new String(inBuff, 0, inPacket.getLength())); 51 } 52 } //捕獲異常 53 catch (IOException ex) { 54 ex.printStackTrace(); 55 try { 56 if (socket != null) { 57 socket.leaveGroup(broadcastAddress); 58 socket.close(); 59 } 60 System.exit(1); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 } 65 66 } 67 68 public static void main(String[] args) throws IOException { 69 new BroadcastSocket().init(); 70 } 71 }
執行結果如下,