多点广播

Datagram只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端。

IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255。

  MulticastSocket 常用的方法:

MulticastSocket(int port) :创建多播套接字并将其绑定到特定端口。创建一个MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,如果结束也需要脱离多点广播地址。
void joinGroup(InetAddress mcastaddr) :加入多播组。 
void leaveGroup(InetAddress mcastaddr) :离开多播组。 
void setLoopbackMode(boolean disable) :启用/禁用多播数据报的本地回送。true 表示禁用 LoopbackMode。

  

案例:群聊

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.InetAddress;
 4 import java.net.MulticastSocket;
 5 import java.util.Scanner;
 6 
 7 public class Chat {
 8     private volatile static boolean exit = false;
 9     private static Scanner input = new Scanner(System.in);
10     private static String username;
11     
12     public static void main(String[] args) throws IOException {
13         MulticastSocket socket = new MulticastSocket(9999);
14         InetAddress ip = InetAddress.getByName("230.0.0.1");
15         socket.joinGroup(ip);
16         socket.setLoopbackMode(false);
17         
18         System.out.print("请输入用户名:");
19         username = input.nextLine();
20         
21         SendThread s = new SendThread(socket,ip);
22         ReceiveThread r = new ReceiveThread(socket);
23         
24         s.start();
25         r.start();
26         
27         try {
28             s.join();
29         } catch (InterruptedException e) {
30             e.printStackTrace();
31         }
32         
33         socket.close();
34         input.close();
35     }
36     static class SendThread extends Thread{
37         private MulticastSocket socket;
38         private InetAddress ip;
39         
40         public SendThread(MulticastSocket socket,InetAddress ip) {
41             super();
42             this.socket = socket;
43             this.ip = ip;
44         }
45         public void run(){
46             try {
47                 while (!exit) {
48                     System.out.print("输入广播消息:");
49                     String message = input.nextLine();
50                     if ("bye".equals(message)) {
51                         exit = true;
52                         break;
53                     }
54     
55                     byte[] data = (username+":"+message).getBytes();
56                     DatagramPacket dp = new DatagramPacket(data, data.length, ip, 9999);
57     
58                     socket.send(dp);
59                 }
60             } catch (IOException e) {
61                 e.printStackTrace();
62             }
63         }
64         
65     }
66     static class ReceiveThread extends Thread{
67         private MulticastSocket socket;
68         
69         public ReceiveThread(MulticastSocket socket) {
70             super();
71             this.socket = socket;
72         }
73     
74         public void run(){
75             try {
76                 while (!exit) {
77                     byte[] data = new byte[1024];
78                     DatagramPacket dp = new DatagramPacket(data, data.length);
79                     socket.receive(dp);
80                     String str = new String(data, 0, dp.getLength());
81                     System.out.println(str);
82                 }
83             } catch (IOException e) {
84                 exit = false;
85             }
86         }
87         
88     }
89 }

 

posted on 2021-06-13 13:48  格物致知_Tony  阅读(484)  评论(0编辑  收藏  举报