Nodejs开发聊天室所遇到的问题 忘解答

Nodejs开发聊天室所遇到的问题 忘解答

最近学习nodeJs 想做一个简单的聊天室。 现已实现广播和数据库的去写 , 但是不知道怎么实现一对一聊天? 除了用类似session id 区分外,请问还有别的办法吗 希望您能给我点思绪

11 回复

当然可以!在Node.js中实现一对一聊天功能,可以通过WebSocket来实现。WebSocket提供了一种全双工通信通道,使得服务器可以直接向客户端发送消息,这非常适合实时聊天应用。

实现思路

  1. 使用WebSocket库:首先,我们需要一个WebSocket库来处理WebSocket连接。常用的库有wssocket.io。这里我们使用socket.io,因为它提供了更高级的API和更好的兼容性。

  2. 建立连接:当用户连接到聊天室时,需要创建一个唯一的标识符来区分不同的用户。

  3. 处理一对一聊天:通过维护一个映射表(例如Map),将用户与他们的WebSocket连接关联起来。这样,你可以通过用户的唯一标识符找到对应的WebSocket连接,并直接向该连接发送消息。

示例代码

安装依赖

npm install express socket.io

创建服务器

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

// 创建Express应用
const app = express();
// 创建HTTP服务器
const server = http.createServer(app);
// 将Socket.IO绑定到HTTP服务器
const io = socketIo(server);

// 存储所有在线用户的连接
const connections = new Map();

// 监听连接事件
io.on('connection', (socket) => {
    console.log('A user connected:', socket.id);

    // 当用户加入聊天室时,设置其用户名
    socket.on('setUsername', (username) => {
        socket.username = username;
        connections.set(username, socket);
        console.log(`${username} set their username to ${username}`);
    });

    // 监听一对一聊天请求
    socket.on('privateMessage', (toUser, message) => {
        const targetSocket = connections.get(toUser);
        if (targetSocket) {
            targetSocket.emit('message', `${socket.username}: ${message}`);
        } else {
            socket.emit('error', 'User is not online.');
        }
    });

    // 监听断开连接事件
    socket.on('disconnect', () => {
        connections.delete(socket.username);
        console.log('A user disconnected:', socket.id);
    });
});

// 启动服务器
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 创建Express和HTTP服务器:使用Express创建一个基础的HTTP服务器,并使用Socket.IO将其转换为WebSocket服务器。

  2. 管理用户连接:使用connections映射表存储每个用户的WebSocket连接。每当用户连接时,将其用户名和连接对象添加到映射表中。

  3. 处理私聊请求:当接收到私聊请求时,通过connections映射表查找目标用户的连接对象,并向其发送消息。

  4. 错误处理:如果目标用户不在线,则返回错误信息。

这样,你就可以实现一对一聊天功能了。希望这个示例对你有所帮助!


都发到服务端,由服务端转发

我参照的网上的例子是: 是都到了服务器端,但是怎么针对某个客户端进行发送。 望指教!

就是有没有指定的函数 供我去调用 不会英文,我看不懂文档

论坛里点对点 socket.io 发送消息的帖子有几个, 搜看下

  • 在服务端保存一个userList={},key是用户的id,这个id可以以cookie的形式加密后种到用户浏览器,value是该用户每个浏览器tab页的socketio对象(即io.sockets.on(‘connection’, function(client))中的client)。
  • 点对点发送时,传入目的地user的id,然后在userList总找出目的用户的所有tab页对应的client对象,然后emit相应信息即可。

socket 的 ID。。。

刚学 很多都不懂 ~

和你一样,也是刚刚入门,可以看看这个 https://github.com/NetEase/chatofpomelo

每个socket连接在header都有一个cookie,可以试试作为唯一标示

要在Node.js中实现一对一聊天功能,除了使用session ID外,还可以考虑使用用户的标识符(如用户名或用户ID)来区分不同的聊天会话。这里提供一种简单的方法,即使用Socket.IO来实现一对一聊天。Socket.IO是一个强大的实时通信库,可以方便地处理WebSocket通信。

示例代码

首先确保安装了Socket.IO

npm install socket.io

然后你可以创建一个基本的服务器和客户端来实现一对一聊天:

服务器端代码(server.js):

const http = require('http');
const socketIo = require('socket.io');

const server = http.createServer();
const io = socketIo(server);

let users = {};

io.on('connection', (socket) => {
    console.log('New client connected');

    socket.on('join', (username) => {
        users[username] = socket.id;
        socket.username = username;
        console.log(`${username} has joined`);
    });

    socket.on('private_message', (data) => {
        const { to, message } = data;
        const receiverId = users[to];
        if (receiverId) {
            io.sockets.sockets.get(receiverId).emit('new_message', { from: socket.username, message });
        }
    });

    socket.on('disconnect', () => {
        console.log(`${socket.username} has left`);
    });
});

server.listen(3000, () => console.log('Server listening on port 3000'));

客户端代码(client.js):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Chat Room</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <input type="text" id="username" placeholder="Username" />
    <button onclick="join()">Join</button>
    <div id="chat-log"></div>
    <input type="text" id="to" placeholder="To Username" />
    <input type="text" id="message" placeholder="Message" />
    <button onclick="sendMessage()">Send</button>

    <script>
        let socket;

        function join() {
            const username = document.getElementById('username').value;
            socket = io();
            socket.emit('join', username);
        }

        function sendMessage() {
            const to = document.getElementById('to').value;
            const message = document.getElementById('message').value;
            socket.emit('private_message', { to, message });
        }

        socket.on('new_message', (data) => {
            document.getElementById('chat-log').innerHTML += `<p><strong>${data.from}</strong>: ${data.message}</p>`;
        });
    </script>
</body>
</html>

解释

  1. 服务器端:当一个用户连接时,服务器存储用户的标识信息(例如用户名),并监听private_message事件,将消息发送到指定的目标用户。
  2. 客户端:当用户点击“Join”按钮时,将用户名发送给服务器,并加入聊天室。当用户点击“Send”按钮时,将目标用户名和消息一起发送给服务器,服务器负责将消息转发给指定的接收者。

这种方法避免了直接使用Session ID,并通过用户名来区分不同的聊天会话。

回到顶部