Nodejs 请问socket.io怎么实现两个人单独聊天
Nodejs 请问socket.io怎么实现两个人单独聊天
网上看到的都是多人聊天室,消息都是服务器广播的,请问怎么用socket.io实现两个人单独聊天?
3 回复
当然可以!Socket.IO 是一个非常强大的库,用于实现实时双向通信。在本帖中,我将展示如何使用 Socket.IO 实现两个用户之间的单独聊天。
示例代码
首先,我们需要设置一个简单的 Node.js 服务器,并安装 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);
let users = {};
io.on('connection', (socket) => {
console.log('A user connected:', socket.id);
// 当用户连接时,监听来自客户端的登录事件
socket.on('login', (username) => {
users[username] = socket.id;
console.log(`${username} logged in.`);
});
// 监听发送私聊消息的事件
socket.on('privateMessage', (data) => {
const { to, message } = data;
if (users[to]) {
io.to(users[to]).emit('message', { from: socket.id, text: message });
} else {
socket.emit('error', 'User not found.');
}
});
// 当用户断开连接时
socket.on('disconnect', () => {
console.log('A user disconnected:', socket.id);
for (let username in users) {
if (users[username] === socket.id) {
delete users[username];
break;
}
}
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
客户端代码
创建一个名为 client.html
的文件,并添加以下代码:
<!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>
<h1>Socket.IO Private Chat</h1>
<input id="username" type="text" placeholder="Username">
<button onclick="login()">Login</button>
<input id="to" type="text" placeholder="To Username">
<input id="message" type="text" placeholder="Message">
<button onclick="sendMessage()">Send</button>
<div id="messages"></div>
<script>
const socket = io();
function login() {
const username = document.getElementById('username').value;
socket.emit('login', username);
}
function sendMessage() {
const to = document.getElementById('to').value;
const message = document.getElementById('message').value;
socket.emit('privateMessage', { to, message });
}
socket.on('message', (data) => {
const messagesDiv = document.getElementById('messages');
messagesDiv.innerHTML += `<p><strong>${data.from}</strong>: ${data.text}</p>`;
});
socket.on('error', (error) => {
alert(error);
});
</script>
</body>
</html>
解释
-
服务器端:
- 使用 Express 创建一个 HTTP 服务器。
- 初始化 Socket.IO 并监听连接事件。
- 用户登录时,将其用户名和 socket ID 存储在一个对象中。
- 当用户发送私聊消息时,找到目标用户的 socket ID 并发送消息。
- 处理用户断开连接的情况。
-
客户端:
- 连接到服务器并监听登录事件。
- 用户输入用户名后,通过
login()
函数发送登录请求。 - 用户输入消息后,通过
sendMessage()
函数发送私聊消息。 - 接收到来自服务器的消息后,显示在页面上。
这样,我们就可以实现两个用户之间的单独聊天功能了。希望这对您有所帮助!
楼主应该仔细的阅读其官网提供的信息。:)
要使用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);
io.on('connection', (socket) => {
console.log('A user connected:', socket.id);
// 当用户请求开始与另一个用户进行一对一聊天时
socket.on('startPrivateChat', (otherUserId, callback) => {
const room = `${socket.id}-${otherUserId}`;
socket.join(room); // 加入该聊天室
callback(room); // 回调函数用于返回聊天室ID
});
// 当发送消息时
socket.on('sendPrivateMessage', (otherUserId, message) => {
const room = `${socket.id}-${otherUserId}`;
socket.to(room).emit('receivePrivateMessage', message);
});
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
客户端代码(client.js)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>One-to-One Chat Example</title>
<script src="/socket.io/socket.io.js"></script>
<script>
let socket;
window.onload = function() {
socket = io();
document.getElementById('connect').onclick = function() {
const otherUserId = 'user1'; // 假设另一个用户的ID是'user1'
socket.emit('startPrivateChat', otherUserId, function(roomId) {
console.log('Joined room:', roomId);
document.getElementById('roomId').innerText = roomId;
});
};
document.getElementById('sendMessage').onclick = function() {
const message = document.getElementById('messageInput').value;
const otherUserId = 'user1';
socket.emit('sendPrivateMessage', otherUserId, message);
};
};
socket.on('receivePrivateMessage', function(message) {
console.log('Received private message:', message);
});
</script>
</head>
<body>
<button id="connect">Connect to User1</button>
<div id="roomId"></div>
<input type="text" id="messageInput" placeholder="Type your message here...">
<button id="sendMessage">Send Message</button>
</body>
</html>
解释
- 服务端:监听到客户端连接后,每当用户请求开始一对一聊天时,创建一个唯一的聊天室,并将两个用户加入到同一个聊天室内。
- 客户端:当用户点击“Connect to User1”按钮时,向服务器发送
startPrivateChat
事件以启动一对一聊天。发送消息时,通过sendPrivateMessage
事件将消息发送给服务器,由服务器转发给指定的聊天室中的对方。
通过这种方式,可以轻松地实现两个人之间的私密聊天。