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>

解释

  1. 服务器端:

    • 使用 Express 创建一个 HTTP 服务器。
    • 初始化 Socket.IO 并监听连接事件。
    • 用户登录时,将其用户名和 socket ID 存储在一个对象中。
    • 当用户发送私聊消息时,找到目标用户的 socket ID 并发送消息。
    • 处理用户断开连接的情况。
  2. 客户端:

    • 连接到服务器并监听登录事件。
    • 用户输入用户名后,通过 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>

解释

  1. 服务端:监听到客户端连接后,每当用户请求开始一对一聊天时,创建一个唯一的聊天室,并将两个用户加入到同一个聊天室内。
  2. 客户端:当用户点击“Connect to User1”按钮时,向服务器发送startPrivateChat事件以启动一对一聊天。发送消息时,通过sendPrivateMessage事件将消息发送给服务器,由服务器转发给指定的聊天室中的对方。

通过这种方式,可以轻松地实现两个人之间的私密聊天。

回到顶部