Java-UDP程序编写(实现组播)

小编 2026-06-17 阅读:1549 评论:0
1.播报广播端 package test; import java.net.DatagramPacket; import java.net.InetAddress; import java....

1.播报广播端

package test;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Weather extends Thread{
	String weather = \"今晚团建\";
	int port = 9898;
	InetAddress ipAddress = null;
	MulticastSocket socket = null;
	/**
	 * 创建广播数据的主机,广播的主机和接收广播的主机必须加入到同一组,
	 * 地址范围是224.0.0.0~224.255.255.255
	 */
	
	
	Weather(){					//构造方法
		try {
			ipAddress = InetAddress.getByName(\"224.255.10.0\");
			socket = new MulticastSocket(port);			//实例化多点广播套接字
			socket.setTimeToLive(1);				//指定发送范围是本地网络
			socket.joinGroup(ipAddress);   			//加入广播组
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void run() {
		while (true) {
			DatagramPacket packet = null;			//声明datagrampacket对象
			byte data[] = weather.getBytes();     //将字符串转化为字节数组
			packet = new DatagramPacket(data, data.length,ipAddress,port);			//将字节数组封装进数据包里
			System.out.println(new String(data));    //将字节数组转化为字符串打印在控制台
			try {
				socket.send(packet);			//发送数据包
				sleep(3000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main (String[] args) {
		Weather w = new Weather();		//创建本类对象
		w.start();						//启动线程
	}
}

2.接收广播端

package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class Receive extends JFrame implements Runnable,ActionListener{  		//实现runable,actionlistener接口
	int port;
	InetAddress groupAddress = null;
	MulticastSocket multicastSocket = null;
	JButton startButton = new JButton(\"开始接收\");
	JButton stopButton = new JButton(\"结束接收\");
	JTextArea inceAr = new JTextArea(5,10);
	JTextArea inced = new JTextArea(5,10);
	Thread thread;
	boolean b = false;
	/**
	 * 接收广播端
	 */
	
	public Receive () {
		super(\"客户端接收\");   						//继承,设置窗口标题为客户端接收
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		thread = new Thread(this);
		startButton.addActionListener(this);
		stopButton.addActionListener(this);
		inceAr.setForeground(Color.blue);
		inced.setForeground(Color.red);					//设置文字的颜色
		JPanel jPanel = new JPanel();
		JPanel jPanel2 = new JPanel();
		JScrollPane jScrollPane = new JScrollPane(inced);   //将文字域添加进滚动面板
		jPanel.add(startButton);
		jPanel.add(stopButton);
		jPanel2.add(jScrollPane,BorderLayout.WEST);
		jPanel2.add(inceAr,BorderLayout.EAST);
		add(jPanel,BorderLayout.SOUTH);
		add(jPanel2,BorderLayout.CENTER);
		validate();								//刷新,如果之前设置了大小,会刷新成为设置的大小
		port = 9898;
		try {
			groupAddress = InetAddress.getByName(\"224.255.10.0\");
			multicastSocket = new MulticastSocket(port);		//绑定多点广播套接字
			multicastSocket.joinGroup(groupAddress);
		} catch (Exception e) {
			e.printStackTrace();
		}
		setBounds(0,0,400,200);			//设置布局
		setVisible(true);				//将布局设置为显示状态
	}
	
	public void run() {
		while (true) {
			byte[] data = new byte[1024];
			DatagramPacket packet = null;
			packet = new DatagramPacket(data, data.length,groupAddress,port);					//将字节数组封装进数据包
			try {
				multicastSocket.receive(packet);
				String messageString = new String(packet.getData(),0,packet.getLength());  		//将数据包里的数据转化为字符串
				inceAr.setText(\"正在接收的内容是:\\n\"+messageString);			//设置正在接收文字内容域
				inced.append(messageString + \"\\n\");				//设置为每条信息为一行
//				validate();
				System.out.println(\"asasas\");
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			if (b == true) {
				break;						//当变量为true时退出循环
			}   
			
		}
	}
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == startButton) {
			startButton.setBackground(Color.red);
			stopButton.setBackground(Color.yellow);
			if (! (thread.isAlive())) {
				thread = new Thread(this);
			}
			thread.start();					//启动线程
		}
		if (e.getSource() == stopButton) {
			startButton.setBackground(Color.yellow);
			stopButton.setBackground(Color.red);
			b = true;
		}
	}
	
	public static void  main(String[] args) {
		Receive receive = new Receive();
//		receive.setSize(400,200);
	}
}

3.接收端接收广播数据
<1>广播端开启
\"在这里插入图片描述\"<2>接收端开启
\"在这里插入图片描述\"

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表