JAVA基礎知識之網絡編程——-使用MutilcastSocket實現多點廣播


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 }

執行結果如下,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM