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 }