跳至主要內容
Skip to content

WebRTC 實戰 (7) —— 信令機制的正式封裝與房間系統

在上一篇中,我們使用 PeerJS 快速實現了連線。但當應用程式變得複雜——例如需要「大廳」、「房間列表」或是「多人進入同一空間」時,簡單的點對點對彈 ID 就顯得力不從心。

這一篇我們將回歸伺服器端,探討如何設計一個具備 「房間 (Room)」 概念的正式信令架構。


一、 房間系統的邏輯抽象

在一個社交或會議軟體中,使用者不應該直接輸入對方的 Peer ID,而是應該輸入「房間號碼」。信令伺服器現在不僅僅是「報馬仔」,它還是一個「管理員」,負責維護誰在哪些房間。


二、 設計擴展性的信令協定

1. 指令規範清單

  • JOIN:使用者加入房間。
  • PEER_JOINED:通知房間內其他使用者有新人加入。
  • SIGNAL:封裝 SDP 或 ICE Candidate(原樣轉發)。
  • LEAVE / PEER_LEFT:使用者主動或意外斷線通知。

三、 實作:房間制信令伺服器 (Node.js)

javascript
const rooms = new Map(); 

wss.on('connection', (ws) => {
  let currentRoom = null;
  let userId = null;

  ws.on('message', (msg) => {
    const { action, room, data, from, to } = JSON.parse(msg);

    switch (action) {
      case 'join':
        userId = from;
        currentRoom = room;
        if (!rooms.has(room)) rooms.set(room, new Set());
        rooms.get(room).forEach(client => client.send(JSON.stringify({ action: 'peer_joined', from: userId })));
        rooms.get(room).add(ws);
        break;

      case 'signal':
        forwardTo(to, { action: 'signal', from: userId, data });
        break;
    }
  });
});

總結

透過建立房間的概念,我們成功解耦了使用者 ID 與連線邏輯,並設計了一套標準的信令協定,為具備產品級水準的通訊軟體打下基礎。

下一章,我們將學習如何使用 WebRTC-Internals 工具剖析通訊中的數據細節。


️ 進階挑戰

試著在你的信令伺服器增加「密碼房間」功能。當使用者發起 join 時,必須帶上正確的 password 參數,否則伺服器會回傳一個 JOIN_DENIED 的訊息。


延伸閱讀與資源

← 上一章:PeerJS 實戰 | 返回專題首頁 | 下一章:WebRTC-Internals 除錯監控