websocket实现一对一聊天

admin 35 0

WebSocket 是一种网络通信协议,它允许在单个 TCP 连接上进行全双工通信,在 WebSocket API 中,通过 WebSocket 对象,可以在单个 TCP 连接上发送和接收消息。

以下是一个简单的 WebSocket 一对一聊天示例:

1. **服务器端(Node.js):**

const WebSocket = require('ws');
const http = require('http');

const server = http.createServer();
const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(ws) {
  // 为每个连接分配一个唯一的 ID
  const id = wss.clients.size + 1;
  console.log('New client connected and was given id ' + id);
  ws.id = id;
  wss.clients.forEach(function each(client) {
    // 将新连接的消息广播给所有其他连接
    if (client !== ws && client.readyState === WebSocket.OPEN) {
      client.send(JSON.stringify({ id: ws.id, message: 'User connected' }));
    }
  });

  ws.on('message', function incoming(message) {
    // 将接收到的消息广播给所有其他连接,除了发送者本身
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  ws.on('close', function close() {
    // 当某个连接关闭时,将该消息广播给所有其他连接
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify({ id: ws.id, message: 'User disconnected' }));
      }
    });
  });
});

2. **客户端(JavaScript):**

在 HTML 中:

```html

WebSocket Chat

Send

const socket = new WebSocket('ws://localhost:8080'); // 连接到服务器地址和端口号

socket.onopen = function (e) {

console.log("Connection established");

socket.send("User connected"); // 发送一个欢迎消息到服务器,通知服务器用户已连接

};

socket.onmessage = function (event) { // 当从服务器接收到消息时触发此事件处理程序

const data = JSON.parse(event.data); // 将接收到的数据从字符串转换为 JavaScript 对象

$('#output').append('' + data.id + ': ' + data.message + ''); // 在网页上显示消息内容

socket.onclose = function (event) { // 当连接关闭时触发此事件处理程序

if (event.wasClean) { // 如果连接正常关闭,则显示一条消息,否则显示一条错误消息。 如果是正常关闭,wasClean 为 true,否则为 false。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是客户端关闭的,则为 true。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false。 如果是由于客户端关闭的,则为 true。 如果是由于网络问题或服务器关闭而关闭的,则为 false