第一个eclipse的代码:
import java.net.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Weather extends Thread { // 创建类。该类为多线程执行程序
int port = 9898; // 定义端口
InetAddress iaddress = null; // 创建InetAddress对象
MulticastSocket socket = null; // 声明多点广播套接字
public Weather() { // 构造方法
try {
//广播地址范围:224.0.0.0~239.255.25.255
iaddress = InetAddress.getByName("224.255.10.0");// 实例化InetAddress,指定地址
socket = new MulticastSocket(port); // 实例化多点广播套接字
// socket.setTimeToLive(1); // 指定发送范围是本地网络
socket.joinGroup(iaddress); // 加入广播组
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}
public void run() { // run()方法
//重点
while (true) {
DatagramPacket packet = null; // 声明DatagramPacket对象
//时间的格式化
String DateNow = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); // 当前日期和时间 System.out.println(DateNow);
String message = "[" + DateNow + "]天气预报,晴天";
//建议少用这个,这个通过new 一个对象来操作对象,占用内存大
// Date date = new Date();
// SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss");//设置日期格式
// String message = "[" + sf.format(date) + "]天气预报,晴天";
byte data[] = message.getBytes(); // 声明字节数组
// 将数据打包
//第一个参数:内存空间,第二个参数,内存大小,第三个参数:数据包的目标地址,第四个参数:端口
packet = new DatagramPacket(data, data.length, iaddress, 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(); // 启动线程
}
}
第二个eclipse代码:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
public class Receive extends JFrame implements Runnable, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
int port; // 定义int型变量
InetAddress group = null; // 声明InetAddress对象
MulticastSocket socket = null; // 创建多点广播套接字对象
JButton ince = new JButton("开始接收"); // 创建按钮对象
JButton stop = new JButton("停止接收");
JTextArea inceAr = new JTextArea(10, 10); // 显示接收广播的文本域
JTextArea inced = new JTextArea(10, 10);
Thread thread; // 创建Thread对象
boolean b = false; // 创建boolean型变量
public Receive() { // 构造方法
super("广播数据报"); // 调用父类方法
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭方式
thread = new Thread(this);
ince.addActionListener(this); // 绑定按钮ince的单击事件
stop.addActionListener(this); // 绑定按钮stop的单击事件
inceAr.setForeground(Color.blue); // 指定文本域中文字颜色
JPanel north = new JPanel(); // 创建Jpane对象
north.add(ince); // 将按钮添加到面板north上
north.add(stop);
add(north, BorderLayout.NORTH); // 将north放置在窗体的上部
JPanel center = new JPanel(); // 创建面板对象center
center.setLayout(new GridLayout(1, 2)); // 设置面板布局
center.add(inceAr); // 将文本域添加到面板上
final JScrollPane scrollPane = new JScrollPane();
center.add(scrollPane);
scrollPane.setViewportView(inced);
add(center, BorderLayout.CENTER); // 设置面板布局
validate(); // 刷新
//重点
port = 9898; // 设置端口号
try {
group = InetAddress.getByName("224.255.10.0"); // 指定接收地址
socket = new MulticastSocket(port); // 绑定多点广播套接字
socket.joinGroup(group); // 加入广播组
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
setBounds(100, 50, 360, 380); // 设置布局
setVisible(true); // 将窗体设置为显示状态
}
public void run() { // run()方法
//重点
while (true) {
byte data[] = new byte[1024]; // 创建byte数组
DatagramPacket packet = null; // 创建DatagramPacket对象
// 待接收的数据包
//第一个参数:内存空间,第二个参数,内存大小,第三个参数:数据包的目标地址,第四个参数:端口
packet = new DatagramPacket(data, data.length, group, port);
try {
socket.receive(packet); // 接收数据包
String message = new String(packet.getData(), 0, packet
.getLength()); // 获取数据包中内容
// 将接收内容显示在文本域中
inceAr.setText("正在接收的内容:\n" + message);
inced.append(message + "\n"); // 每条信息为一行
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
if (b == true) { // 当变量等于true时,退出循环
break;
}
}
}
public void actionPerformed(ActionEvent e) { // 单击事件
if (e.getSource() == ince) { // 单击按钮ince触发的事件
ince.setBackground(Color.red); // 设置按钮颜色
stop.setBackground(Color.yellow);
if (!(thread.isAlive())) { // 如线程不处于“新建状态”
thread = new Thread(this); // 实例化Thread对象
}
thread.start(); // 启动线程
b = false; // 设置变量值
}
if (e.getSource() == stop) { // 单击按钮stop触发的事件
ince.setBackground(Color.yellow); // 设置按钮颜色
stop.setBackground(Color.red);
b = true; // 设置变量值s
}
}
public static void main(String[] args) { // 主方法
Receive rec = new Receive(); // 创建本类对象
rec.setSize(460, 200); // 设置窗体大小
}
}
第一个eclipse的运行结果:
第二个eclipse的运行结果: