🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
UDP程序设计步骤如下: **1. 发送数据包:** (1)使用`DatagramSocket()`创建一个数据包套接字; (2)使用`DatagramPacket(byte[] buf, int offset, int length , InetAddress address , int port)`创建要发送的数据包; (3)使用`DatagramSocket`类的`send()`发送数据包。 **2. 接收数据包:** (1)使用`DatagramSocket(int port)`创建数据包套接字,绑定要指定端口; (2)使用`DatagramPacket(byte[] buf, int length)`创建字节数组来接收数据包; (3)使用`DatagramPacket`类的`receive()`接收UDP数据包。 下面是一个广播数据报程序。主机不断重复播出节目预报,可以保证加入到同一组的主机随时接收到广播信息。接收者将正在接收的信息放在左边的文本框中,将全部接收的信息放在右边的文本框中。 *使用eclipse创建两个独立的工作空间,然后分别编写发送端和接收端的程序,先运行发送端程序,再运行接收端程序。或者使用cmd来执行。* **`net/server/UdpServer.java`**(发送端) ```java package net.server; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; /** * 发送端 * @version 2020/10/21 * */ public class UdpServer extends Thread{ private String weather = "节目预告:八点有大型晚会,请收听!"; private int count = 1; private int port = 6000; // 指定端口 private InetAddress ipAddress = null; //表示IP地址的类 private MulticastSocket multicastSocket = null; //多点广播套接字 public UdpServer() { try { // 指定局域网广播组的IP地址 ,该IP必须在:224.0.0.0-239.255.255.255 范围内,不是你电脑的IP地址 ipAddress = InetAddress.getByName("224.255.10.0"); multicastSocket = new MulticastSocket(port); multicastSocket.setTimeToLive(1); // 指定发送的范围为本地网络 multicastSocket.joinGroup(ipAddress); // 将IP地址加入广播组 } catch (Exception e) { e.printStackTrace(); } } /** * 该函数不需要调用,当调用start()时会自动调用 */ public void run() { while(true) { // 要发送的数据包 DatagramPacket packet = null; // 将字符串转换为字节数组 byte[] data = (weather+count++).getBytes(); // 将要发送的数据打包 packet = new DatagramPacket(data, data.length, ipAddress, port); System.out.println(new String(data)); try { multicastSocket.send(packet); // 发送数据 sleep(3000); // 每隔3000ms发送一次 } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { UdpServer udp = new UdpServer(); udp.start(); // 启动线程,自动调用run() } } ``` **`net/client/UdpClient.java`**(接收端) ``` package net.client; import java.awt.*; import java.awt.event.*; import java.net.*; import javax.swing.*; /** * 接收端 * @version 2020/7/3 * */ public class UdpClient extends JFrame implements Runnable, ActionListener{ private int port = 6000; // 端口 private InetAddress ipAddress = null; // IP地址类 private MulticastSocket multicastSocket = null; // 多点广播套接字对象 private JButton ince = new JButton("开始接收"); private JButton stop = new JButton("停止接收"); private JTextArea inceAr = new JTextArea(10, 10); private JTextArea inced = new JTextArea(10, 10); private Thread thread; private boolean b = false; public UdpClient() { super("广播数据报"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); thread = new Thread(this); ince.addActionListener(this); stop.addActionListener(this); inceAr.setForeground(Color.blue); JPanel north = new JPanel(); north.add(ince); north.add(stop); add(north, BorderLayout.NORTH); JPanel center = new JPanel(); center.setLayout(new GridLayout(1, 2)); center.add(inceAr); center.add(inced); add(center, BorderLayout.CENTER); validate(); // 刷新窗口组件 try { ipAddress = InetAddress.getByName("224.255.10.0"); // 指定IP地址 multicastSocket = new MulticastSocket(port); // 指定端口 multicastSocket.joinGroup(ipAddress); // 将IP地址加入广播组 } catch (Exception e) { e.printStackTrace(); } setBounds(100, 50, 360, 380); setVisible(true); } /** * 该方法不能显示调用,调用start()时会自动调用 */ public void run() { while(true) { byte data[] = new byte[1024]; DatagramPacket packet = null; // 待接收到的数据打包 packet = new DatagramPacket(data, data.length, ipAddress, port); try { multicastSocket.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) break; // 退出循环 } } /** * 单击事件,该函数不能显示调用,单击按钮时会自动调用 */ public void actionPerformed(ActionEvent e) { if (e.getSource() == ince) { ince.setBackground(Color.red); stop.setBackground(Color.yellow); if (!(thread.isAlive())) { // 如果线程不是新建状态则新建一个线程 thread = new Thread(this); } thread.start(); // 启动线程,run()会被自动调用 b = false; } if (e.getSource() == stop) { ince.setBackground(Color.yellow); stop.setBackground(Color.red); b = true; } } public static void main(String[] args) { UdpClient udp = new UdpClient(); udp.setSize(460, 200); } } ``` ``` 打开第一个cmd窗口执行服务端程序: 编译源码:javac TcpServer.java -encoding utf-8 执行程序:java net.server.TcpServer 打开第二个cmd窗口执行客户端程序: 编译源码:javac TcpClient.java -encoding utf-8 执行程序:java net.client.TcpClient 打开第三个cmd窗口执行客户端程序: 编译源码:javac TcpClient.java -encoding utf-8 执行程序:java net.client.TcpClient ``` 效果如下: ![](https://img.kancloud.cn/1a/29/1a29afd84e6768ecec69a527cb571100_1313x397.png)