架構圖解
Client A (Socket) ←→ Server ←→ Client B (Socket)
Port 5000 Port 5000 Port 5000
關鍵步驟
- 雙方各自建立
GCDAsyncSocket,綁定本地埠(如 5000),啟動監聽 socket.acceptOnPort(5000)。
- 伺服器維護
Map 線上用戶連線。
- A 發送訊息 → 伺服器根據目標 userId 查找 B 的 Socket → 轉發資料。
- B 監聽到資料 → 解析 → 更新 UI。
代碼片段
// Client 端
GCDAsyncSocket *socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[socket acceptOnPort:5000 error:nil];
// 發送
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[socket writeData:data withTimeout:-1 tag:0];
// Server 端轉發
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
// 解析目標 userId
GCDAsyncSocket *targetSocket = onlineUsers[targetId];
[targetSocket writeData:data withTimeout:-1 tag:0];
}
注意
- 需處理斷線重連、心跳保活(定時發送 Ping)。
- 生產環境建議使用成熟 IM 框架(如 OpenIM、Hyphenate)或 WebSocket + 消息佇列。