Java基于UDP Socket实现简易局域网聊天室

阿澈
阿澈
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍如何使用 Java 中的 DatagramSocket 类,结合 UDP 协议创建一个简单的局域网聊天室。该方案利用多线程分别处理数据的发送与接收,通过广播机制实现多台设备的即时通信,是理解 Java 网络编程基础的实用示例。

实现原理与架构

本示例采用 UDP(用户数据报协议)进行数据传输,相较于 TCP 协议,UDP 无需建立连接即可发送数据,适合对实时性要求较高的场景。程序的核心逻辑分为两部分:

  • 发送端 (SendDemo):监听用户控制台输入,将文本转换为字节数组并通过广播 IP 发送出去。
  • 接收端 (ReceiveDemo):在指定端口持续监听数据包,解析来源 IP、端口及消息内容并打印输出。

由于使用广播地址 192.168.1.255,同一局域网内的所有运行该程序的客户端均可收到彼此的消息。

准备工作

  1. 开发环境:JDK 1.8 或更高版本,IDE(如 IntelliJ IDEA 或 Eclipse)。
  2. 网络配置:确保所有参与测试的设备处于同一局域网段内(例如 192.168.1.x)。
  3. 防火墙:若无法通信,请检查是否允许 UDP 端口(默认 10001)的出入站流量。

第1步:创建聊天室主入口类

定义 ChatRoomDemo 作为程序入口,主要任务是初始化 socket 对象并启动两个线程。

  • 关键参数:
    - 发送端 Socket:绑定任意可用端口。
    - 接收端 Socket:固定绑定端口 10001,必须与发送端目标端口一致。
package com.socket.demo;
import java.io.IOException;
import java.net.DatagramSocket;
public class ChatRoomDemo {
  public static void main(String[] args) throws IOException {
    System.out.println("----进入聊天室----");
    // 创建发送和接收 Socket
    DatagramSocket send = new DatagramSocket();
    DatagramSocket rece = new DatagramSocket(10001);
    
    // 启动发送线程
    new Thread(new SendDemo(send)).start();
    // 启动接收线程
    new Thread(new ReceiveDemo(rece)).start();
  }
}

第2步:编写发送功能模块

SendDemo 负责读取用户输入并将其封装为 UDP 数据包发送。重点在于使用局域网广播地址以确保消息能被组内其他设备接收。

  • 核心动作:读取行输入 → 转换字节 → 创建 DatagramPacket → 发送。
  • 退出机制:当输入内容为 "886" 时,中断循环并关闭 Socket。
package com.socket.demo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo implements Runnable {
  private DatagramSocket ds;

  public SendDemo(DatagramSocket ds) {
    this.ds = ds;
  }

  @Override
  public void run() {
    try {
      BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
      String line = null;
      while ((line = bufr.readLine()) != null) {
        byte[] buf = line.getBytes();
        // 使用广播地址发送,使同网段所有主机都能收到
        DatagramPacket dp = new DatagramPacket(
          buf, buf.length,
          InetAddress.getByName("192.168.1.255"), 10001);
        ds.send(dp);
        if ("886".equals(line)) break;
      }
      ds.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

第3步:编写接收功能模块

ReceiveDemo 在一个死循环中阻塞等待数据。接收到数据后,解析出发送者的 IP、端口和内容并格式化打印。

  • 完成状态判断:控制台持续显示新收到的消息格式为 IP::消息内容。
package com.socket.demo;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo implements Runnable {
  private DatagramSocket ds;

  public ReceiveDemo(DatagramSocket ds) {
    this.ds = ds;
  }

  @Override
  public void run() {
    try {
      while (true) {
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        // 阻塞式接收
        ds.receive(dp);
        
        // 解析数据
        String ip = dp.getAddress().getHostAddress();
        int port = dp.getPort();
        String text = new String(dp.getData(), 0, dp.getLength());
        
        System.out.println(ip + "::" + text);
        
        // 检测退出信号
        if (text.equals("886")) {
          System.out.println(ip + "....退出聊天室");
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

运行上述代码后,在同一局域网下打开多个终端分别执行各机器的 ChatRoomDemo,即可看到如下效果(此处以典型运行界面示意):

注意事项与排错

  • IP 地址适配:示例中使用的是广播地址 192.168.1.255。如果你的局域网网段不同(如 10.0.0.x),需修改 InetAddress.getByName() 中的值为对应网段的广播地址(通常是子网掩码全1结尾的地址)。
  • 异常处理:生产环境中建议完善 try-catch 块,记录具体异常堆栈以便调试。
  • 资源释放:确保程序正常退出时调用 ds.close(),防止端口占用。

以上就是基于 Java Socket 实现简易聊天室的详细内容,更多关于 Java 网络编程的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表