MulticastSocket 广播消息

本文介绍了如何利用MulticastSocket在Java中实现广播消息功能。MulticastSocket能够将数据报发送到D类IP地址,使得所有连接该地址的客户端都能接收到数据,这种广播基于UDP协议。操作涉及DatagramPacket的使用,以及与之相关的几个关键方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. MulticastSocket 将数据报发送到广播地址(任意的D类可用IP地址),数据报会自动 “广播”所有假如该IP地址的Client。

2. MulticastSocket广播也是使用的UDP协议,同样要使用DatagramPacket。

注意三个方法:

	public void setTimeToLive(int ttl) 
		throws IOException  
		通过设置ttl值(可跨过的网段数),控制广播范围(0 —— 数据只能停留在本机;1 —— 数据在当前局域网广播 ;32 —— 数据在本站点网络广播; 64 —— 数据在本地区广播;128 —— 数据在本大洲广播;255 —— 数据在全球广播)

	public void joinGroup(InetAddress mcastaddr)
               throws IOException

	public void leaveGroup(InetAddress mcastaddr)
                throws IOException
 
 
发送:方法与DatagramPacket的发送方法一样,只是数据包的地址是个 广播地址
接收:首先要调用 joinGroup()方法加入指定广播地址,再接收
 
 
 
 
 
 
示例代码:
BroadCast.java
import java.net.MulticastSocket;
import java.net.InetAddress;
import java.net.DatagramPacket;
import java.util.Scanner;
import java.io.IOException;


public class BroadCast{
	final static int BROAD_PORT = 2013;  //定义MulticastSocket绑定的端口号
	final static String BROAD_ADDRESS = "225.0.0.1";  //定义广播IP(任意可用的D类IP地址)
	
	static InetAddress mCastAddr;


	public static void main(String[] args){
		try(
			//创建多播套接字并将其绑定到特定端口,用于发送/接收数据报
			//MulticastSocket(int port)
			MulticastSocket castSocket = new MulticastSocket(BROAD_PORT);


			//键盘输入
			Scanner scanner = new Scanner(System.in);
		){
			//返回指定主机的IP,这里是返回广播地址对应的InetAddress对象
			//public static InetAddress getByName(String host) throws UnknownHostException
			mCastAddr = InetAddress.getByName(BROAD_ADDRESS);


			//设置数据在局域网内广播 —— TTL = 1	
			//public void setTimeToLive(int ttl) throws IOException
			castSocket.setTimeToLive(1);


			//加入多播组
			//public void joinGroup(InetAddress mcastaddr) throws IOException
			castSocket.joinGroup(mCastAddr);


			/*******************************************/
			// 启动一条线程,用于读取接收到的广播消息
			new ReceiveThread(castSocket).start();
			/******************************************/


			while(scanner.hasNextLine()){//等待输入
				//将键盘输入作为content(待发送数据)
				String content =  scanner.nextLine();
				//构造数据报报,作为发送给“广播”的数据报
				//public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
				DatagramPacket sendToBroadCastPacket = new DatagramPacket(content.getBytes(),
					content.getBytes().length,mCastAddr,BROAD_PORT);


				//MulticastSocket对象 castSocket调用send()方法发送数据报
				castSocket.send(sendToBroadCastPacket);
			}


		}
		catch(IOException ex){
			ex.printStackTrace();
		}
		
	}
}


/******************用于接收数据报的线程类***************/
class ReceiveThread extends Thread{
	private MulticastSocket castSocket;
	final static int PACKET_SIZE = 1024*4;


	public ReceiveThread(MulticastSocket castSocket){
		this.castSocket = castSocket;
	}	


	@Override 
	public void run(){
		//读取广播数据报
		while(true){
			try{
				/********本质就是UDP数据包的读取 **********/
				//public DatagramPacket(byte[] buf,int length)
				//构造 DatagramPacket,用来接收长度为 length 的数据包。
				
				DatagramPacket receiveFromBroadPacket = new DatagramPacket(new byte[PACKET_SIZE],PACKET_SIZE);


				//castSocket调用receive()方法接收数据报
				castSocket.receive(receiveFromBroadPacket);


				/************** 至此数据报接收过程完毕 *********/


				//打印接收的数据
				System.out.println(new String(receiveFromBroadPacket.getData(),0,receiveFromBroadPacket.getLength()));
			}
			catch(IOException ex){
				ex.printStackTrace();
				if(castSocket != null){//连接不为空
					try{
						//如果有连接断开
						//public void leaveGroup(InetAddress mcastaddr) throws IOException
						castSocket.leaveGroup(BroadCast.mCastAddr);	
						
						//public void close()关闭此数据报套接字。 
						castSocket.close();
					}
					catch(IOException iex){
						iex.printStackTrace();
					}
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值