📜  websocket 和 socket 之间的区别 (1)

📅  最后修改于: 2023-12-03 14:48:26.211000             🧑  作者: Mango

WebSocket 和 Socket 之间的区别

WebSockets 和 Sockets 都是用于在客户端和服务器之间建立实时通信的技术。但是,它们之间有一些区别。

WebSocket

WebSocket 是一种协议,它建立在 HTTP 协议之上,可以在客户端和服务器之间建立持久连接。它是一个双向通信协议,允许服务器和客户端同时发送和接收消息。使用 WebSocket 可以使实时通信更加高效、可靠和快速。

特点
  • WebSocket 是建立在 HTTP 协议之上的,因此使用 HTTP 端口(80 或 443)。它的握手过程使用 HTTP 协议,但在握手成功之后,它会升级到 WebSocket 协议。
  • WebSocket 是双向通信协议,它允许服务器和客户端同时发送和接收消息。
  • WebSocket 具有更低的延迟和更高的吞吐量,因为它使用更少的头信息,并且发送消息的顺序可以得到保证。
  • WebSocket 可以使用 WebSocket API 进行交互。WebSocket API 允许开发者在客户端和服务器之间进行实时通信。
  • WebSocket 支持跨域通信。
代码示例

下面是在 Node.js 中使用 WebSocket 实现简单聊天室的例子:

// 引入 WebSocket 模块
const WebSocket = require('ws');

// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });

// 监听连接事件
wss.on('connection', (ws) => {
  console.log('客户端已连接');

  // 监听消息事件
  ws.on('message', (message) => {
    console.log(`收到消息:${message}`);

    // 广播消息
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });
});
Socket

Socket 是一种 API,它可以在应用程序之间建立基于 TCP 的连接。与 HTTP 不同,Socket 允许客户端和服务器之间建立长时间的连接,并且在连接建立后可以任意发送数据。

特点
  • Socket 是基于 TCP 协议的,它建立的是一个长时间的连接,因此它可以支持实时通信。
  • Socket 是双向通信的,客户端和服务器都可以发送和接收消息。
  • Socket 的延迟和吞吐量都比 HTTP 高,因为它没有 HTTP 的开销。
  • Socket 是面向流的,因此发送的消息可能会被拆分成多个数据包。
  • Socket 不支持跨域通信。
代码示例

下面是在 Node.js 中使用 Socket 实现简单聊天室的例子:

// 引入 net 模块
const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
  console.log('客户端已连接');

  // 监听数据事件
  socket.on('data', (data) => {
    console.log(`收到消息:${data}`);

    // 广播消息
    server.connections.forEach((client) => {
      if (client !== socket) {
        client.write(data.toString());
      }
    });
  });
});

// 监听端口
server.listen(8080);
总结

WebSocket 和 Socket 都是用于建立实时通信的技术,它们之间的区别如下:

  • WebSocket 建立在 HTTP 协议之上,而 Socket 是基于 TCP 的。
  • WebSocket 支持跨域通信,而 Socket 不支持。
  • WebSocket 具有更低的延迟和更高的吞吐量,因为它使用更少的头信息,并且发送消息的顺序可以得到保证。
  • WebSocket 可以使用 WebSocket API 进行交互,而 Socket 使用的是标准的网络 API。