Nodejs socket.io 多房间聊天室
Nodejs socket.io 多房间聊天室
一个聊天室可以有多个房间,不同房间根据url区分,进入房间后,即建立socket连接,但我如何传送这个房间号呢?即建立connection 到时候需要把这个socket push到房间内。大神们求解!
7 回复
我自己用过两个办法 一个是登录用http请求进来之后用http发请求 还有一个是在socket认证的时候多一部操作 有点类似三次握手 但我们进行两次 第一次进入公关空间然后服务器响应返回一个welcome然后用户发送房间号并开始监听这个房间号 这样服务器也拿到了房间号可以接受信息并广播了 自豪地采用 CNodeJS ionic
可以收发文件就好了
3楼正解,官方网站也有示例代码啊。
在Node.js中使用socket.io实现多房间聊天室时,可以通过传递房间号来区分不同的房间,并将用户的socket连接加入相应的房间。以下是一个简单的示例代码,展示了如何实现这一功能。
示例代码
-
安装依赖
首先,确保你已经安装了
socket.io
库:npm install express socket.io
-
服务器端代码 (server.js)
const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const app = express(); const server = http.createServer(app); const io = socketIo(server); // 存储房间的映射 const rooms = {}; io.on('connection', (socket) => { console.log('A user connected:', socket.id); socket.on('joinRoom', (roomName) => { if (!rooms[roomName]) { rooms[roomName] = []; } rooms[roomName].push(socket.id); socket.join(roomName); console.log(`User ${socket.id} joined room: ${roomName}`); }); socket.on('sendMessage', (data) => { const { room, message } = data; io.to(room).emit('receiveMessage', { from: socket.id, message }); }); socket.on('disconnect', () => { console.log('A user disconnected:', socket.id); for (const room in rooms) { const index = rooms[room].indexOf(socket.id); if (index > -1) { rooms[room].splice(index, 1); } } }); }); server.listen(3000, () => { console.log('Server is running on port 3000'); });
-
客户端代码 (client.js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Socket.IO Chat</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <input type="text" id="roomName" placeholder="Enter Room Name"> <button onclick="joinRoom()">Join Room</button> <div id="messages"></div> <input type="text" id="message" placeholder="Type a message..."> <button onclick="sendMessage()">Send</button> <script> const socket = io(); function joinRoom() { const roomName = document.getElementById('roomName').value; socket.emit('joinRoom', roomName); } function sendMessage() { const message = document.getElementById('message').value; const roomName = document.getElementById('roomName').value; socket.emit('sendMessage', { room: roomName, message }); } socket.on('receiveMessage', (data) => { const messagesDiv = document.getElementById('messages'); messagesDiv.innerHTML += `<p><strong>${data.from}</strong>: ${data.message}</p>`; }); </script> </body> </html>
解释
-
服务器端
- 创建一个Express应用并启动HTTP服务器。
- 使用socket.io处理WebSocket连接。
- 当用户连接时,监听
joinRoom
事件来加入指定的房间,并将用户添加到该房间的列表中。 - 用户发送消息时,通过
sendMessage
事件将消息广播给该房间内的所有用户。 - 当用户断开连接时,从房间列表中移除该用户。
-
客户端
- 提供输入框让用户输入房间名,并点击按钮加入房间。
- 提供输入框让用户输入消息,并点击按钮发送消息。
- 监听来自服务器的消息,并显示在页面上。
通过这种方式,你可以轻松地实现多房间聊天室的功能。