Java UDP 廣播與多播

一、廣播: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.0239.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的廣播和多播的功能,主要是理解多播和廣播的概念。尤爲是組播,之前停留在概念上,只知道是傳送給一組主機而不是全部主機,今天才豁然了。


歡迎轉載,但請引用本文連接。

相關文章
相關標籤/搜索