首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

基於 UDP 協議的控制台聊天室實現

     編輯:Java 綜合教學

專案概述

這是一個基於 UDP 協議的簡易控制台聊天工具,支援好友管理(添加、刪除、列表)、消息收發、本地存儲好友信息。由於 UDP 無連接特性,採用定時輪詢方式接收消息。

核心功能模塊

1. 網絡通信層

  • 發送: 使用 DatagramSocket 和 DatagramPacket 將消息封裝發送到指定 IP 和端口(默認 8087)。
  • 接收: 綁定端口監聽,利用 Timer 和 TimerTask 每秒輪詢一次 socket.receive(),解析發送方 IP 並匹配好友列表顯示備註名。

2. 好友管理

  • 使用兩個 ArrayList 分別存儲好友 IP 和備註名。
  • IP 合法性通過正則表達式驗證(IPv4 格式)。
  • 好友數據持久化到本地文件 haoyou,格式為 名稱#IP,採用追加/覆蓋模式更新。

3. 交互邏輯

  • 主菜單循環調用 huiHua() 進入會話模式。
  • 會話中支援指令:@list@ 顯示好友、@add@ 添加好友、@delete@ 刪除好友、00000 退出會話。
  • 發送消息時自動獲取目標 IP 調用 send()。

關鍵代碼片段

發送消息

public static void send(String ip, String info) throws Exception {
    byte[] message = info.getBytes();
    InetAddress addr = InetAddress.getByName(ip);
    DatagramPacket packet = new DatagramPacket(message, message.length, addr, PORT);
    DatagramSocket socket = new DatagramSocket();
    socket.send(packet);
}

定時接收任務

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        try {
            socket1.receive(packet1);
            String msg = new String(info1, 0, packet1.getLength());
            String name = packet1.getAddress().toString().replace("/", "");
            int idx = list.indexOf(name);
            System.out.println((idx == -1 ? "陌生人" : listName.get(idx)) + " : " + msg);
            packet1.setLength(info1.length);
        } catch (Exception e) { e.printStackTrace(); }
    }
}, 100, 1000);

運行說明

導出為可執行 JAR 後,需編寫批處理腳本(.bat)啟動:

java -jar %1
pause

確保系統已安裝 JRE 環境。雙擊腳本即可運行雙開測試(需不同 IP/端口)。

改進方向

  • 引入多線程分離發送/接收,避免定時器延遲。
  • 增加用戶身份驗證與消息加密。
  • 實現圖形界面(Swing/JavaFX)提升體驗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved