Java UDP网络编程

        基于UDP的信息传递的很快,但不提供可靠的保证,使用UDP传递数据时,用户无法知道数据能否正确到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。

UDP网络编程广播案例:

发送:

import java.net.*;

public class Weather extends Thread { // 创建类。该类为多线程执行程序
	String weather = "节目预报:八点有大型晚会,请收听";
	int port = 9898; // 定义端口
	InetAddress iaddress = null; // 创建InetAddress对象
	MulticastSocket socket = null; // 声明多点广播套接字
	
	Weather() { // 构造方法
		try {
			// 实例化InetAddress,指定地址
			iaddress = InetAddress.getByName("224.255.10.0");
			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对象
			byte data[] = weather.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(); // 启动线程
	}
}

接收:

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); // 设置窗体大小
	}
}

你可能感兴趣的:(Java)