Nodejs 怎样建立两用户之间的长连接

Nodejs 怎样建立两用户之间的长连接

初学nodejs,打了遍书的例子,打算做个聊天功能,现在用mongodb+redis做了简单的上下线提示和简单的群聊,请教下如何私聊呢

4 回复

Node.js 怎样建立两用户之间的长连接

在构建一个实时的聊天应用时,实现两用户之间的私聊是一个常见的需求。为了实现这一目标,我们可以使用 WebSocket 技术来建立客户端和服务器之间的持久连接。这里,我们将使用 socket.io 这个流行的库来简化这一过程。

步骤 1: 安装必要的依赖

首先,你需要安装 expresssocket.ioexpress 是一个快速、无冗余的 web 应用框架,而 socket.io 则用于处理 WebSocket 连接。

npm install express socket.io

步骤 2: 设置服务器

创建一个基本的 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);

app.get('/', (req, res) => {
  res.send('Hello World!');
});

io.on('connection', (socket) => {
  console.log('a user connected');
  
  // 监听私聊请求
  socket.on('private message', (msg) => {
    const { to, text } = msg;
    // 发送消息给指定用户
    socket.to(to).emit('new private message', text);
  });

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

server.listen(3000, () => {
  console.log('listening on *:3000');
});

步骤 3: 创建客户端

接下来,我们需要在客户端创建一个 WebSocket 连接,并发送和接收消息。

<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
  <title>WebSocket Chat</title>
</head>
<body>
  <input id="message" type="text">
  <button onclick="sendMessage()">Send</button>
  <ul id="messages"></ul>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    const socket = io();

    function sendMessage() {
      const messageInput = document.getElementById('message').value;
      const recipient = 'user-id-of-the-recipient'; // 填写接收者的ID
      socket.emit('private message', { to: recipient, text: messageInput });
    }

    socket.on('new private message', (text) => {
      const messagesList = document.getElementById('messages');
      const li = document.createElement('li');
      li.textContent = text;
      messagesList.appendChild(li);
    });
  </script>
</body>
</html>

解释

  • 服务器端:我们设置了一个基本的 HTTP 服务器,并通过 socket.io 处理 WebSocket 连接。当用户连接时,服务器监听 'private message' 事件,并将消息转发给指定的用户。
  • 客户端:客户端通过 socket.io 连接到服务器,并通过发送 'private message' 事件来触发私聊。服务器接收到这个事件后,会将消息广播到指定的用户。

通过这种方式,你可以轻松地实现用户之间的私聊功能。


可以考虑用pomelo框架来做聊天,代码量很少,易扩展。 https://github.com/NetEase/pomelo

NB!你能再牛点么……哈哈!

要实现两个用户之间的私聊,可以使用WebSocket技术来建立一个持久的双向通信连接。WebSocket可以在客户端和服务端之间保持一个持久的连接,并允许双方自由地发送数据。

以下是一个简单的示例,展示如何使用WebSocket来实现实时的私聊功能。这里我们将使用ws库来创建WebSocket服务器和客户端。

安装依赖

首先,你需要安装ws库:

npm install ws

WebSocket服务器

创建一个名为server.js的文件,用于启动WebSocket服务器:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    console.log("New client connected");

    ws.on('message', function incoming(message) {
        const data = JSON.parse(message);
        console.log('received: %s', message);

        if (data.type === 'private') {
            // 查找指定的客户端并发送消息
            const client = wss.clients.find(client => client.id === data.to);
            if (client && client.readyState === WebSocket.OPEN) {
                client.send(JSON.stringify({
                    type: 'private',
                    from: data.from,
                    content: data.content
                }));
            }
        }
    });

    ws.on('close', function close() {
        console.log('Client disconnected');
    });
});

WebSocket客户端

创建一个名为client.js的文件,用于模拟两个客户端:

const WebSocket = require('ws');

function createClient(id, name) {
    const ws = new WebSocket(`ws://localhost:8080`);
    
    ws.on('open', () => {
        ws.id = id;
        console.log(`${name} is connected`);
    });

    ws.on('message', function incoming(message) {
        const data = JSON.parse(message);
        if (data.type === 'private' && data.from === id) {
            console.log(`${name} received private message from ${data.from}: ${data.content}`);
        }
    });

    return ws;
}

const client1 = createClient(1, "Alice");
const client2 = createClient(2, "Bob");

// 模拟Alice给Bob发送一条私聊消息
setTimeout(() => {
    client1.send(JSON.stringify({
        type: 'private',
        to: 2,
        from: 1,
        content: 'Hello Bob!'
    }));
}, 2000);

运行程序

  1. 启动WebSocket服务器:
node server.js
  1. 在另一个终端窗口中运行客户端:
node client.js

解释

  • 服务器端:当有新的客户端连接时,会监听来自该客户端的消息。如果接收到的消息类型为private,则查找目标客户端并发送消息。
  • 客户端:每个客户端连接到WebSocket服务器后,可以互相发送私聊消息。本例中我们通过定时器模拟了一个客户端向另一个客户端发送私聊消息的过程。

以上代码提供了一个基本的框架,你可以根据具体需求进行扩展和优化,例如添加身份验证、错误处理等。

回到顶部