WebSocket 详细教程

WebSocket 是一种网络通信协议,它实现了客户端与服务器之间的全双工通信。与传统的 HTTP 协议不同,WebSocket 允许服务器主动向客户端发送消息,这对于实时应用(如在线聊天、股票交易、游戏等)来说非常重要。

1. 工作原理

WebSocket 的工作原理如下:

  1. 客户端向服务器发送一个 HTTP 请求,请求建立 WebSocket 连接。
  2. 服务器收到请求后,会返回一个 HTTP 响应,响应中包含一个 101 Switching Protocols 状态码,表示同意建立 WebSocket 连接。
  3. 服务器和客户端通过 TCP 连接进行通信,数据格式为 JSON、二进制或文本。

2. 优点

WebSocket 相比 HTTP 协议有以下优点:

  1. 实时性:服务器可以主动向客户端发送消息,实现实时通信。
  2. 双向通信:客户端和服务器之间可以同时发送和接收数据。
  3. 性能:WebSocket 连接建立后,数据传输效率更高,减少了 HTTP 请求的次数。
  4. 兼容性:WebSocket 协议在大多数浏览器中得到了支持,无需额外插件。

3. 实现

实现 WebSocket 通信通常需要使用 JavaScript 和后端语言(如 Node.js、Python、Java 等)。以下是一个简单的 WebSocket 实现示例:

客户端(JavaScript)
javascript 复制代码
// 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:8080');
// 连接打开时触发
socket.onopen = function(event) {
  console.log('连接成功');
};
// 接收到服务器消息时触发
socket.onmessage = function(event) {
  console.log('收到消息:', event.data);
};
// 连接关闭时触发
socket.onclose = function(event) {
  console.log('连接关闭');
};
// 连接出错时触发
socket.onerror = function(error) {
  console.log('连接出错:', error);
};
// 发送消息到服务器
function sendMessage(message) {
  socket.send(message);
}
服务器端(Node.js)
javascript 复制代码
const WebSocket = require('ws');
// 创建 WebSocket 服务器实例
const wss = new WebSocket.Server({ port: 8080 });
// 监听连接事件
wss.on('connection', function(socket) {
  console.log('新连接');
  // 监听接收消息事件
  socket.on('message', function(message) {
    console.log('收到消息:', message);
  });
  // 发送消息到客户端
  function sendMessageToClient(message) {
    socket.send(message);
  }
  // 每隔1秒向客户端发送消息
  setInterval(() => {
    sendMessageToClient('服务器消息');
  }, 1000);
});

4. API

WebSocket 提供了以下 API:

  1. WebSocket():创建一个新的 WebSocket 连接。
  2. open():连接成功打开时触发。
  3. onmessage:接收到服务器消息时触发。
  4. send():向服务器发送消息。
  5. close():关闭 WebSocket 连接。

5. 示例应用

WebSocket 广泛应用于各种实时应用,如在线聊天、股票交易、游戏等。以下是一个简单的在线聊天示例:

客户端(JavaScript)
javascript 复制代码
// 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:8080');
// 连接打开时触发
socket.onopen = function(event) {
  console.log('连接成功');
};
// 接收到服务器消息时触发
socket.onmessage = function(event) {
  const message = document.createElement('div');
  message.textContent = '服务器:' + event.data;
  document.body.appendChild(message);
};
// 连接关闭时触发
socket.onclose = function(event) {
  console.log('连接关闭');
};
// 连接出错时触发
socket.```
socket.onerror = function(error) {
  console.log('连接出错:', error);
};
// 发送消息到服务器
function sendMessage(message) {
  socket.send(message);
}
// 在输入框中添加发送按钮
const input = document.createElement('input');
input.type = 'text';
input.placeholder = '输入消息';
input.addEventListener('input', function(event) {
  sendMessage(event.target.value);
});
document.body.appendChild(input);
服务器端(Node.js)
javascript 复制代码
const WebSocket = require('ws');
// 创建 WebSocket 服务器实例
const wss = new WebSocket.Server({ port: 8080 });
// 监听连接事件
wss.on('connection', function(socket) {
  console.log('新连接');
  // 监听接收消息事件
  socket.on('message', function(message) {
    console.log('收到消息:', message);
    // 广播消息给所有客户端
    wss.clients.forEach(function each(client) {
      if (client !== socket && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });
  // 发送消息到客户端
  function sendMessageToClient(message) {
    socket.send(message);
  }
  // 每隔1秒向客户端发送消息
  setInterval(() => {
    sendMessageToClient('服务器消息');
  }, 1000);
});

6. 安全性

WebSocket 协议本身是安全的,但你需要确保 WebSocket 连接是通过 HTTPS 协议建立的,以防止中间人攻击。在 Node.js 中,你可以使用 wss 模块来创建一个安全的 WebSocket 服务器。

7. 总结

WebSocket 是一种强大的网络通信协议,它允许服务器和客户端之间进行实时、双向通信。在 WebSocket 连接中,服务器可以主动向客户端发送消息,这对于实时应用来说非常重要。通过使用 JavaScript 和后端语言,你可以轻松实现 WebSocket 通信。在实际应用中,WebSocket 已被广泛应用于在线聊天、股票交易、游戏等领域。

相关推荐
yyuuuzz6 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
GlobalInfo6 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
运维行者_8 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
2401_868534788 小时前
陈冲2026年上海纽约大学全英文毕业演讲
服务器·网络
FPGA小迷弟10 小时前
FPGA开发Vivado Block Design/Vitis/SDK/xlinx/开发教程,保姆级别,一看就会!
网络协议·tcp/ip·fpga开发·verilog·fpga
FPGA小迷弟10 小时前
基于FPGA实现智能网卡的概念,什么是智能网卡
网络协议·tcp/ip·fpga开发·verilog·fpga
DYWorker00112 小时前
第1课:基于正点原子RK3568开发板读懂Linux内核
linux·运维·网络
Lzg_na14 小时前
数据链路层差错控制使用的算法详解
网络
努力努力再努力wz14 小时前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
loulanyue_14 小时前
当AI学会自主攻击与渗透破壁:Agent行为链失控与Mythos级攻防颠覆下的安全范式重构——读CNCC2026第六届网络生态治理论坛实录
网络·人工智能·安全