聊天消息
对服务端而言,一对一聊天就是将消息从一个 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)的事件指定到目标房间。