Socket.io教程: 多聊天室(分组)的简单设计与实现(前端通过调用后端方法加入分组,可加入多个组)
后端设计
/**
* 服务器端向不同的组发送消息
*/
const express = require('express');
var url = require('url');
const http = require('http');
const socketIO = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIO(server,{
cors: {
origin: '*'
}
});
server.listen(24000, () => {
console.log('server running at 127.0.0.1:24000');
});
app.use(express.static('./public'));
/* socket.io 逻辑 */
io.on('connection', (socket) => {
socket.on('addgroup1', () => {
socket.join('group1');
});
socket.on('addgroup2', () => {
socket.join('group2');
});
socket.on('sendMsg', (data) => {
data.id = socket.id;
io.emit('receiveMsg', data);
});
socket.on('sendToOurGroup', (data) => {
data.id = socket.id;
for (const room of socket.rooms) {
if (room !== socket.id) {
socket.to(room).emit("receiveMsg", data);
}
}
})
});
前端设计
<template>
<div style="float: left; width: 30%">
<button @click="group1">Group1</button>
<button @click="group2">Group2</button>
<hr />
群聊<input type="text" id="inputArea" />
<button id="sendmsg" @click="sendMsgToServer">发送</button>
<button id="sendtoourgroup" @click="sendMsgToGroupServer">
发给本组用户
</button>
<div style="float: left; width: 65%" id="chatbox"></div>
</div>
</template>
<script>
import io from "socket.io-client";
let socket = io.connect("http://127.0.0.1:24000");
export default {
name: "HelloWorld",
data() {
return {};
},
methods: {
group1() {
socket.emit("addgroup1");
},
group2() {
socket.emit("addgroup2");
},
sendMsgToServer() {
let data = { msg: document.getElementById("inputArea").value };
socket.emit("sendMsg", data);
},
sendMsgToGroupServer() {
let data = { msg: document.getElementById("inputArea").value };
socket.emit("sendToOurGroup", data);
},
},
created() {
socket.on("receiveMsg", (data) => {
console.log(data);
let chatBox = document.getElementById("chatbox");
let div = document.createElement("div");
div.innerHTML = `${data.id}: ${data.msg}`;
chatBox.appendChild(div);
});
},
};
</script>
相关说明
后端增加组方法的好处是一个Socket可以添加到多个组,可以是接收多个组的消息。能够满足更多需求
不同客户端调用服务器端不同的方法,加入groupid即可实现分组, 分组内的通信是同步的,分组之间互不干扰(调用服务器端方法可以加入很多分组)
socket.join(groupid); 加入分组
socket.rooms 包含socket.id和groupid集合
socket.to(room).emit("receiveMsg", data);通知socket.id内包含所有groupid组别
socket.join()
socket.leave()
一个负责添加用户,一个负责删除。
socket.to负责找到该组别
私聊:
私聊其实就是找到该用户的socket然后触发socket就行。所以有两个方法:
1. 直接将所有用户的socket保存到一个数组中,以用户名为键,要发给谁直接从数组中找。
2. 还是以用户名为键,但是以socket.id为值,找到id后,再通过id找到该socket。
我们使用第二种方法,第一种比较浪费资源。
第二种方法实际上也是socket.to(id)这个api发送的,具体就不在详细写了,大家那么聪明,看了分组之后一定能够举一反三吧。
项目已经上传至github https://github.com/neuqzxy/chat 其中socket是该博客的文件夹,还有两个文件夹,chat文件夹是 《聊天室入门实战》系列的文件夹
原文链接:https://blog.csdn.net/neuq_zxy/category_7081297.html 我在此基础上修改html为Vue页面供大家参考
本文来自博客园,作者:王晓升,转载请注明原文链接:https://www.cnblogs.com/xiaosheng1989/p/16478251.html

浙公网安备 33010602011771号