一、廣播:java
同一網段全部主機都能接收,前提是端口要監聽服務器
客戶端發送廣播,開啓端口監聽的服務端接收並打印消息app
服務端程序:spa
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class TestServer { public static void main(String[] args) { int port = 9999;//開啓監聽的端口 DatagramSocket ds = null; DatagramPacket dp = null; byte[] buf = new byte[1024];//存儲發來的消息 StringBuffer sbuf = new StringBuffer(); try { //綁定端口的 ds = new DatagramSocket(port); dp = new DatagramPacket(buf, buf.length); System.out.println("監聽廣播端口打開:"); ds.receive(dp); ds.close(); int i; for(i=0;i<1024;i++){ if(buf[i] == 0){ break; } sbuf.append((char) buf[i]); } System.out.println("收到廣播消息:" + sbuf.toString()); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
發送端程序:.net
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { // 廣播的實現 :由客戶端發出廣播,服務器端接收 String host = "255.255.255.255";//廣播地址 int port = 9999;//廣播的目的端口 String message = "test";//用於發送的字符串 try { InetAddress adds = InetAddress.getByName(host); DatagramSocket ds = new DatagramSocket(); DatagramPacket dp = new DatagramPacket(message.getBytes(), message.length(), adds, port); ds.send(dp); ds.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
二、多播code
多播數據報套接字類用於發送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具備加入 Internet 上其餘多播主機的「組」的附加功能。字符串
多播組經過 D 類 IP 地址和標準 UDP 端口號指定。D 類 IP 地址在 224.0.0.0
和 239.255.255.255
的範圍內(包括二者)。地址 224.0.0.0 被保留,不該使用。get
能夠經過首先使用所需端口建立 MulticastSocket,而後調用 joinGroup(InetAddress groupAddr)
方法來加入多播組:(以上是jdk-doc的說明,補充以下:服務器和客戶端必須都要加入相同的組播地址才能夠)io
服務器端程序:ast
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.SocketException; public class TestServer { public static void main(String[] args){ //接受組播和發送組播的數據報服務都要把組播地址添加進來 String host = "225.0.0.1";//多播地址 int port = 9998; int length = 1024; byte[] buf = new byte[length]; MulticastSocket ms = null; DatagramPacket dp = null; StringBuffer sbuf = new StringBuffer(); try { ms = new MulticastSocket(port); dp = new DatagramPacket(buf, length); //加入多播地址 InetAddress group = InetAddress.getByName(host); ms.joinGroup(group); System.out.println("監聽多播端口打開:"); ms.receive(dp); ms.close(); int i; for(i=0;i<1024;i++){ if(buf[i] == 0){ break; } sbuf.append((char) buf[i]); } System.out.println("收到多播消息:" + sbuf.toString()); } catch (IOException e) { e.printStackTrace(); } } }
客戶端程序:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.SocketException; import java.net.UnknownHostException; public class Test { public static void main(String[] args){ String host = "225.0.0.1";//多播地址 int port = 9998; String message = "test-multicastSocket"; try { InetAddress group = InetAddress.getByName(host); MulticastSocket s = new MulticastSocket(); //加入多播組 s.joinGroup(group); DatagramPacket dp = new DatagramPacket(message.getBytes(),message.length(),group,port); s.send(dp); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
簡單實現了一下基於UDP的廣播和多播的功能,主要是理解多播和廣播的概念。尤爲是組播,之前停留在概念上,只知道是傳送給一組主機而不是全部主機,今天才豁然了。
歡迎轉載,但請引用本文連接。