Socket.io教程: 多聊天室(分组)的简单设计与实现(前端通过调用后端方法加入分组,可加入多个组)
后端设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /** * 服务器端向不同的组发送消息 */ 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); } } }) }); |
前端设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南