» Rust:使用Socket.IO创建Web Chat App在线聊天应用 » 2. 开发 » 2.3 聊天消息

聊天消息

对服务端而言,一对一聊天就是将消息从一个 socket 转发到另一个 socket。

更新 src/main.rs:

@@ -18,6 +18,13 @@ struct User {
     sid: Option<String>,
 }
 
+#[derive(Serialize, Deserialize, Debug, Clone)]
+struct ChatData {
+    to: String,
+    from: String,
+    msg: String,
+}
+
 type UserStore = HashMap<String, User>;
 
 async fn on_connect(s: SocketRef) {
@@ -35,6 +42,7 @@ async fn on_connect(s: SocketRef) {
                 emoji: user.emoji,
                 sid: Some(s.id.to_string()),
             };
+            s.join(s.id).ok(); // Hack: join its own room for private messaging
             let mut binding = users.write().await;
             binding.insert(s.id.to_string(), new_user);
             let items: Vec<(String, User)> = binding
@@ -46,7 +54,12 @@ async fn on_connect(s: SocketRef) {
             s.broadcast().emit("contacts", (items.clone(),)).ok();
             s.emit("contacts", (items,)).ok(); // Emit to itself as well
         },
-    )
+    );
+
+    s.on("chat", |s: SocketRef, Data::<ChatData>(data)| async move {
+        let to = data.to.clone();
+        s.to(to).emit("chat", data).ok();
+    });
 }
 
 #[tokio::main]

data 包含以下字段:

  • to: 消息的目标接收者 socket ID。
  • from: 发送者的 socket ID。
  • msg: 消息内容。

主要两处逻辑改动:

  • s.join(s.id) 将 socket 加入到自身 ID 命名的房间,方便后续获取使用。
  • s.to(...).emit(...) 用于将发出(emit)的事件指定到目标房间。
上页下页