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

Java UDP 聊天室實作:序列化物件傳輸與多執行緒架構

     編輯:Java 相關知識

架構設計

採用 UDP 協定實作簡易聊天室,核心元件:

  • Message:可序列化訊息物件,含內容、發送者 ID、接收者 ID
  • Sender:發送執行緒,將 Message 序列化為位元組陣列並封裝成 DatagramPacket 發送
  • Receiver:接收執行緒,阻塞接收封包並反序列化還原 Message

Message 類別

public class Message implements Serializable {
    private String msg, id, destId;
    public Message(String msg, String id, String destId) {
        this.msg = msg; this.id = id; this.destId = destId;
    }
    // getter 方法...
}

發送端實作

public class Sender extends Thread {
    private DatagramSocket socket;
    private DatagramPacket packet;

    public Sender(Message msg) throws IOException {
        this.msg = msg;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(msg);
        oos.flush();
        byte[] data = bos.toByteArray();
        packet = new DatagramPacket(data, data.length,
            InetAddress.getByName(msg.getDestId()), 7002);
        socket = new DatagramSocket(7000);
    }

    public void run() {
        try { socket.send(packet); } catch (IOException e) { e.printStackTrace(); }
        finally { socket.close(); }
    }
}

接收端實作

public class Receiver extends Thread {
    private DatagramSocket socket;
    private DatagramPacket packet;
    private byte[] buf = new byte[500];

    public Receiver() throws SocketException {
        socket = new DatagramSocket(7002);
        packet = new DatagramPacket(buf, buf.length);
    }

    public void run() {
        try {
            while (true) {
                socket.receive(packet);
                ObjectInputStream ois = new ObjectInputStream(
                    new ByteArrayInputStream(buf));
                Message msg = (Message) ois.readObject();
                System.out.println(msg.getId() + ": " + msg.getMessage());
            }
        } catch (Exception e) { e.printStackTrace(); }
    }
}

關鍵技術點

  • 使用 ByteArrayOutputStream + ObjectOutputStream 實現物件序列化
  • 發送/接收埠號分離(7000/7002)避免衝突
  • 接收緩衝區大小需大於預期最大封包
  • UDP 無連線特性:不保證送達順序與可靠性

此為教學級範例,生產環境需加入訊息確認、重傳、心跳偵測、加密等機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved