浅谈WebSocket及如何搭建实时聊天系统

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: WebSocket 是一种在客户端和服务器之间提供全双工、双向通信的网络协议。它是基于TCP/IP协议栈的应用层协议,旨在实现浏览器与服务器之间的实时、低延迟且高效的长连接通信

一、浅谈WebSocket

WebSocket 是一种在客户端和服务器之间提供全双工、双向通信的网络协议。它是基于TCP/IP协议栈的应用层协议,旨在实现浏览器与服务器之间的实时、低延迟且高效的长连接通信。
基本概念:

  • 持久连接(Persistent Connection): WebSocket建立连接后会保持活跃状态,允许双方随时发送数据而无需每次请求都重新建立连接。
  • 全双工通信(Full-duplex Communication): 与传统的HTTP协议不同,WebSocket支持同时在客户端和服务器之间进行双向的数据传输,即两者都可以作为数据发起者。

工作原理:

  1. 握手阶段(Handshaking): 建立WebSocket连接之前,首先通过一个特殊的HTTP升级请求来协商协议升级。客户端在请求头中包含Upgrade: websocket字段,服务器响应同意升级后,连接从HTTP切换到WebSocket协议。
  2. 消息传输:一旦握手成功,WebSocket连接便处于开放状态,客户端和服务器可以互相发送帧(frame),其中包括文本或二进制数据。这种机制使得服务器可以主动推送更新,而不需要客户端轮询请求。

特点:

  • 低延迟:由于连接是持续打开的,减少了传统HTTP的请求-响应模式中的延迟和网络开销。
  • 减少带宽消耗:因为只需要一次握手,并且数据传输格式更紧凑,所以相比于频繁轮询或长轮询方式,WebSocket能更有效地使用网络资源。
  • 跨域支持:WebSocket像HTTP一样支持跨域访问,这使得开发者能够构建跨域的实时应用。
  • 事件驱动:客户端可以通过监听特定事件(如“open”、“message”、“close”等)来处理WebSocket连接的状态变化和接收到的数据。

应用场景:
WebSocket广泛应用于实时聊天系统、协同编辑工具、股票报价系统、在线游戏、物联网设备实时通讯等多种需要实时交互和信息推送的场景。
总之,WebSocket通过其独特的设计克服了传统HTTP协议在实现实时性、双向通信方面的局限性,极大地增强了Web应用程序的功能和用户体验。

二、实施聊天系统搭建步骤

1.创建WebSocket连接

客户端通过JavaScript代码创建WebSocket连接,指定服务器的WebSocket地址。

const socket = new WebSocket('ws://localhost:8080/chat');

2.监听连接状态

客户端需要监听WebSocket连接的状态,以便处理连接打开、关闭、错误等事件。

socket.addEventListener('open', function(event) {
   
  console.log('Connection opened');
});

socket.addEventListener('close', function(event) {
   
  console.log('Connection closed');
});

socket.addEventListener('error', function(event) {
   
  console.error('Error occurred:', event);
});

3.发生消息

当用户输入消息并点击发送按钮时,客户端将消息发送给服务器。

const sendMessageButton = document.getElementById('send-button');
sendMessageButton.addEventListener('click', function() {
   
  const messageInput = document.getElementById('message-input');
  const message = messageInput.value;
  socket.send(message);
  messageInput.value = '';
});

4.接收消息

服务器收到消息后,将其广播给所有连接的客户端。客户端监听来自服务器的消息,并将其显示在聊天窗口中。

socket.addEventListener('message', function(event) {
   
  const message = event.data;
  const chatLog = document.getElementById('chat-log');
  const newMessage = document.createElement('div');
  newMessage.textContent = message;
  chatLog.appendChild(newMessage);
});

5.实现服务器端逻辑

服务器端需要处理WebSocket连接的建立、消息的接收和广播等逻辑。可以使用支持WebSocket协议的服务器端技术,如Node.js的ws模块或Java的Jetty等。
以上是构建一个基本的WebSocket实时聊天系统的主要步骤。根据实际需求,还可以添加用户认证、消息加密、历史消息存储等功能。

相关文章
|
15天前
|
监控 JavaScript API
局域网监控软件的实时通知系统:利用Node.js和WebSocket实现即时消息推送
本文介绍了如何使用Node.js和WebSocket构建局域网监控软件的实时通知系统。实时通知对于网络安全和家庭监控至关重要,能即时发送监控数据变化的通知,提高响应速度。通过Node.js创建WebSocket服务器,当数据变化时,监控软件发送消息至服务器,服务器随即推送给客户端。此外,还展示了如何利用Node.js编写API,自动将监控数据提交到网站,便于用户查看历史记录,从而提升监控体验。
69 3
|
8月前
|
JavaScript 前端开发 Java
SpringBoot+Vue搭建一个WebSocket的实时聊天室
SpringBoot+Vue搭建一个WebSocket的实时聊天室
159 0
|
9月前
|
网络协议 BI
直播系统源码协议探索篇(二):网络套接字协议WebSocket
直播系统源码网络套接字协议WebSocket搭建参考代码 connected_clients.add(websocket) try: async for message in websocket: await broadcast(message) finally: connected_clients.remove(websocket)
直播系统源码协议探索篇(二):网络套接字协议WebSocket
BXA
|
监控 网络协议 JavaScript
Spring WebSocket构建实时交互系统
Spring WebSocket是基于WebSocket协议的一个开源框架,它使得开发人员可以更加方便地建立实时通信机制,以推送消息和数据并实时更新通信系统中的状态。Spring WebSocket被广泛应用于社交网站、电子商务、在线游戏等WEB应用程序中,以实现实时通信和即时响应。
BXA
146 0
|
Linux PHP Windows
|
移动开发 网络协议 前端开发
为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统
websocket是个啥? webSocket是一种在单个TCP连接上进行全双工通信的协议 webSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统
|
自然语言处理 NoSQL 安全
windows版gbc:基于enginx的组件服务器系统paas,可用于mixed web与websocket game
本文关键字:利用nginx实现paas,利用nginx实现组件化游戏引擎,(openresty)nginx+lua实现混合cs/bs一体化分布式架构
374 0
windows版gbc:基于enginx的组件服务器系统paas,可用于mixed web与websocket game
|
Web App开发 Java
从构建分布式秒杀系统聊聊WebSocket推送通知
前言 秒杀架构到后期,我们采用了消息队列的形式实现抢购逻辑,那么之前抛出过这样一个问题:消息队列异步处理完每个用户请求后,如何通知给相应用户秒杀成功? 场景映射 首先,我们举一个生活中比较常见的例子:我们去银行办理业务,一般会选择相关业务打印一个排号纸,然后就可以坐在小板凳上玩着手机,等待被小喇叭报号。
3801 0
|
网络协议 前端开发 安全
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现