8.1UDP点对点聊天小项目

这个Java项目实现了一个基于UDP协议的点对点聊天程序,支持双向消息发送和接收。程序通过命令行参数配置远程IP、远程端口和本地端口,默认值为127.0.0.1、12345和8888。核心功能包括:使用DatagramSocket和DatagramPacket进行UDP通信,多线程处理接收数据以避免阻塞主线程,以及通过ThreadControl类控制线程生命周期。程序支持UTF-8编码的消息传输,并使用GBK编码读取控制台输入

复制代码
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.Charset;
import java.util.Scanner;

class ThreadControl {
    // 使用 volatile 修饰变量
    volatile boolean running = true;
}

public class Test3 {
    public static void main(String[] args) {
        // 默认远程IP地址和端口,以及本地端口
        String remoteIp = "127.0.0.1";
        int remotePort = 12345;
        int localPort = 8888;
    
        // 如果提供了命令行参数,则使用参数值覆盖默认值
        if (args.length == 3) {
            remoteIp = args[0];
            remotePort = Integer.parseInt(args[1]);
            localPort = Integer.parseInt(args[2]);
        }
    
        try {
            // 获取服务器地址
            InetAddress serverAddress = InetAddress.getByName(remoteIp);
            // 创建本地 DatagramSocket 实例,绑定到指定的本地端口
            DatagramSocket socket = new DatagramSocket(localPort);
    
            // 创建线程控制对象
            ThreadControl control = new ThreadControl();
    
            // 创建并启动接收数据的线程
            Thread receiveThread = new Thread(() -> {
                while (control.running) {
                    try {
                        // 准备接收数据的缓冲区和数据包
                        byte[] receiveData = new byte[1024];
                        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                        // 接收数据包
                        socket.receive(receivePacket);
    
                        // 将接收到的数据转换为字符串并打印
                        String response = new String(receivePacket.getData(), 0, receivePacket.getLength(),"UTF-8");
                        System.out.println(receivePacket.getAddress().toString() + ":" + receivePacket.getPort() + " 发送数据: " + response);
                    } catch (IOException e) {
                        // 只有在程序运行时才打印异常堆栈信息
                        if (control.running) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            receiveThread.start();
    
            // 创建 Scanner 对象以读取控制台输入
            Scanner scanner = new Scanner(new InputStreamReader(System.in, Charset.forName("GBK")));
            while (true) {
                // 提示用户输入消息
                System.out.println("请输入要发送给客户端的消息:");
                String userInput = scanner.nextLine();
                System.out.println(userInput);
                // 如果用户输入 "exit",则退出循环
                if (userInput.equals("exit")) {
                    break;
                }
    
                // 将用户输入的消息转换为字节数组
                byte[] sendData = userInput.getBytes("UTF-8");
                try {
                    // 创建数据包并发送
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, remotePort);
                    socket.send(sendPacket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            // 停止接收线程
            control.running = false;
            receiveThread.interrupt(); // 可选:强制中断阻塞中的线程
    
            // 关闭资源
            scanner.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用说明

  1. 两个人点对点聊天,通过java Test3 对方IP 对方端口 本地端口 启动程序
  2. 另一边也是同样的,通过java Test3 对方IP 对方端口 本地端口 启动程序
  3. 两个人就实现了点对点 upd 通信
  4. 输入 "exit" 可以退出。

这个 Java 小项目实现了一个基于 UDP 协议的简单聊天程序,支持接收和发送消息。以下是该项目的简要总结:

1. 功能概述

  • UDP 通信 :使用 DatagramSocket 和 DatagramPacket 实现了基于 UDP 的网络通信。
  • 双向交互:程序可以同时接收远程主机的消息,并向远程主机发送用户输入的消息。
  • 命令行参数支持:允许通过命令行传入远程 IP、远程端口和本地端口以覆盖默认配置。

2. 关键技术点

  • 多线程处理 :
    • 使用单独的线程(receiveThread)持续监听并接收数据,避免阻塞主线程。
    • 使用 ThreadControl 类中的 volatile boolean running 控制线程生命周期。
  • 字符编码处理 :
    • 发送端使用 UTF-8 编码将字符串转为字节流。
    • 接收端也使用 UTF-8 解析收到的数据包。
    • 控制台输入使用 GBK 编码读取(适配 Windows控制台 环境)。
  • 异常处理机制 :
    • 对 IOException 进行捕获,并在程序退出时选择性地打印异常信息。

3. 核心类/对象说明

  • ThreadControl:用于控制接收线程的运行状态,其中 running 是 volatile 变量,确保线程间可见性。
  • DatagramSocket:代表本地 UDP 套接字,用于接收和发送数据包。
  • Scanner:用于从控制台读取用户输入。
  • InetAddress:表示远程服务器的地址。

4. 使用说明

  • 启动方式:

    java Test3 [remoteIp remotePort localPort]

    如果不提供参数,则使用默认值:

    • remoteIp = "127.0.0.1"
    • remotePort = 12345
    • localPort = 8888
  • 操作流程:

    • 启动后自动开始监听本地端口。
    • 用户可在控制台输入消息发送给远程主机。
    • 输入 exit 结束程序。

5. 适用场景

适用于简单的局域网内设备调试或测试用途的 UDP 通信程序,具有良好的可读性和可扩展性。

相关推荐
Sarvartha7 小时前
final 关键字
java·开发语言
2601_952047797 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
数据狐(Datafox)8 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
木子n19 小时前
车载以太网与SOME/IP服务化通信实战-01.从字节到服务:SOME/IP报文解析与四通道开销账
网络·网络协议·tcp/ip·车载以太网·some/ip
Escalating_xu10 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦10 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
一个风轻云淡10 小时前
GCC 和 GDB命令简单解读
java·linux·前端
省钱兄--zs11 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析