WebSocket 初体验:构建实时通信应用
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行双向通信,从而实现低延迟的数据交换。WebSocket非常适合需要实时交互的应用场景,比如聊天应用、在线游戏、实时数据分析等。
WebSocket简介
什么是WebSocket?
WebSocket是一种网络通信协议,它提供了一个全双工的通信通道,允许客户端和服务器端通过TCP连接直接进行数据交换。与HTTP协议不同的是,WebSocket在连接建立之后可以持续不断地发送和接收数据,而不是每次请求都需要重新建立连接。
WebSocket的优势
- 低延迟:由于WebSocket建立了一条持久的连接,所以数据传输速度更快。
- 双向通信:客户端和服务器都可以主动发送数据。
- 减少服务器负担:不需要频繁地建立和关闭连接,减少了资源消耗。
- 更好的用户体验:实时数据更新提高了用户体验。
WebSocket的应用场景
- 实时聊天:即时消息传递。
- 在线游戏:玩家间的实时互动。
- 股票行情:实时推送股票价格变动。
- 协作编辑:多人同时编辑文档。
- 物联网(IoT):设备之间的实时通信。
实现WebSocket通信
1. 客户端
JavaScript API
在客户端,可以通过简单的JavaScript API来创建WebSocket连接。
示例代码
javascript
深色版本
1// 创建WebSocket连接
2const socket = new WebSocket('ws://example.com/ws');
3
4// 连接打开时触发
5socket.addEventListener('open', function (event) {
6 console.log('Connection opened');
7});
8
9// 接收消息时触发
10socket.addEventListener('message', function (event) {
11 console.log('Message received:', event.data);
12});
13
14// 连接关闭时触发
15socket.addEventListener('close', function (event) {
16 console.log('Connection closed');
17});
18
19// 发送消息
20socket.send('Hello from client!');
2. 服务器端
Node.js + WebSocket库
在Node.js环境中,可以使用ws库来轻松创建WebSocket服务器。
安装ws库
bash
深色版本
1npm install ws
示例代码
javascript
深色版本
1const WebSocket = require('ws');
2
3// 创建WebSocket服务器
4const server = new WebSocket.Server({ port: 8080 });
5
6server.on('connection', function connection(ws) {
7 console.log('Client connected');
8
9 // 当收到客户端的消息时
10 ws.on('message', function incoming(message) {
11 console.log('received: %s', message);
12
13 // 向客户端发送消息
14 ws.send(`Echo: ${message}`);
15 });
16
17 // 当连接关闭时
18 ws.on('close', function close() {
19 console.log('Client disconnected');
20 });
21});
实战案例:简单聊天应用
我们将构建一个简单的聊天应用,演示如何使用WebSocket实现实时通信。
1. 准备工作
- 安装Node.js和npm。
- 创建一个新的项目文件夹。
- 初始化项目并安装依赖。
bash深色版本
1npm init -y 2npm install express ws
2. 创建服务器端
创建一个名为server.js的文件,用于设置WebSocket服务器。
javascript
深色版本
1const express = require('express');
2const WebSocket = require('ws');
3
4const app = express();
5const server = require('http').createServer(app);
6const wss = new WebSocket.Server({ server });
7
8wss.on('connection', function connection(ws) {
9 console.log('Client connected');
10
11 ws.on('message', function incoming(message) {
12 console.log('received: %s', message);
13 wss.clients.forEach(function each(client) {
14 if (client !== ws && client.readyState === WebSocket.OPEN) {
15 client.send(message);
16 }
17 });
18 });
19
20 ws.on('close', function close() {
21 console.log('Client disconnected');
22 });
23});
24
25app.use(express.static('public'));
26
27server.listen(3000, function listening() {
28 console.log('Listening on %d', server.address().port);
29});
3. 创建客户端
在项目的public文件夹中创建一个名为index.html的文件,用于展示聊天界面。
html
深色版本
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>WebSocket Chat</title>
6 <style>
7 body { font-family: Arial, sans-serif; }
8 #chat { height: 300px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px; }
9 input[type=text], button { margin-top: 10px; }
10 </style>
11</head>
12<body>
13 <div id="chat"></div>
14 <input type="text" id="input" placeholder="Type a message...">
15 <button onclick="sendMessage()">Send</button>
16
17 <script>
18 const chatBox = document.getElementById('chat');
19 const inputField = document.getElementById('input');
20
21 // 创建WebSocket连接
22 const socket = new WebSocket('ws://localhost:3000/ws');
23
24 // 连接打开时触发
25 socket.addEventListener('open', function (event) {
26 console.log('Connection opened');
27 });
28
29 // 接收消息时触发
30 socket.addEventListener('message', function (event) {
31 const message = event.data;
32 const messageElement = document.createElement('p');
33 messageElement.textContent = message;
34 chatBox.appendChild(messageElement);
35 chatBox.scrollTop = chatBox.scrollHeight;
36 });
37
38 // 发送消息
39 function sendMessage() {
40 const message = inputField.value;
41 if (message.trim()) {
42 socket.send(message);
43 inputField.value = '';
44 }
45 }
46
47 // 连接关闭时触发
48 socket.addEventListener('close', function (event) {
49 console.log('Connection closed');
50 });
51 </script>
52</body>
53</html>
4. 运行应用
- 在终端中运行
node server.js启动服务器。 - 打开浏览器,访问
http://localhost:3000。
现在,你可以在不同的浏览器窗口或标签页中打开聊天应用,并尝试发送消息,观察消息是否能够在客户端之间实时传输。
总结
通过以上步骤,你已经学会了如何使用WebSocket构建一个简单的聊天应用。WebSocket提供了强大的实时通信能力,使得开发者可以轻松地构建各种实时应用。随着对WebSocket的深入了解,你可以尝试更复杂的应用场景和技术挑战。
相关文章:
WebSocket 初体验:构建实时通信应用
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行双向通信,从而实现低延迟的数据交换。WebSocket非常适合需要实时交互的应用场景,比如聊天应用、在线游戏、实时数据分析等。 WebSocket简介 什么是WebSocket…...
LISA: Reasoning Segmentation via Large Language Model
发表时间:CVPR 2024 论文链接:https://openaccess.thecvf.com/content/CVPR2024/papers/Lai_LISA_Reasoning_Segmentation_via_Large_Language_Model_CVPR_2024_paper.pdf 作者单位:CUHK Motivation:尽管感知系统近年来取得了显…...
企业发展与数字化转型:创新驱动未来增长的关键策略
引言 在当今全球化和信息化高度融合的时代,数字化转型已经成为企业寻求增长和保持竞争优势的关键战略。随着技术的飞速进步,数字化不仅改变了商业模式和市场格局,还深刻影响了企业的内部运作和外部生态系统。大数据、人工智能、物联网等新兴技…...
如何选择适合自己的编程语言,为什么R是非计算机专业数据分析的最佳选择,五大点告诉你
在如今的数据驱动世界中,编程语言已成为希望在行业中进行数据分析的专业人士不可或缺的技能。对于非计算机专业背景的学者和学生来说,选择适合自己的编程语言可能看似困难。本文将探讨为什么对于那些需要进行本科生论文、研究生论文、或者发表学术成果的…...
【经验分享】数据结构——求树的叶子结点个数计算方法
目录 一道题就可以学会 这种题做法固定,记住两个公式即可 解惑: 1、为什么n2010110x? 2、为什么是n-120*410*31*210*1x*0? 🌈 嗨,我是命运之光! 🌌 2024,每日百字&…...
第十一章:图论part04 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长(补)
任务日期:7.29 题目一链接:110. 字符串接龙 (kamacoder.com) 思路:将本题寻找附近的字符串等效于寻找四周的陆地,即寻找周围与当前字符只有一位不同的字符串,然后加入到队列中并标记上,在此基础上要将字符…...
Linux中安装MYSQL数据库
文章目录 一、MYSQL数据库介绍1.1、MySQL数据库的基本概述1.2、MySQL数据库的主要特性1.3、MySQL数据库的技术架构与组件1.4、MySQL数据库的应用与扩展性1.5、MySQL数据库的许可模式与开源生态 二、MySQL Workbench和phpMyAdmin介绍2.1、MySQL Workbench介绍2.2、phpMyAdmin介绍…...
Vue前端服务加密后端服务解密--AES算法实现
在实际项目中考虑到用户数据的安全性,在用户登录时,前端需要对用户密码加密(防止用户密码泄露),服务端收到登录请求时先对密码进行解密,然后再进行用户验证登操作。本文使用 AES ECB 模式算法来实现前端机密…...
matlab实现文字识别
在MATLAB中实现文字识别通常涉及图像处理技术和机器学习算法,特别是使用MATLAB内置的Image Processing Toolbox和Machine Learning Toolbox。下面是一个基本的步骤指南,展示如何在MATLAB中设置和执行一个简单的OCR(Optical Character Recogni…...
Leetcode - 周赛409
目录 一,3242. 设计相邻元素求和服务 二,3243. 新增道路查询后的最短距离 I 三,3244. 新增道路查询后的最短距离 II 四,3245. 交替组 III 一,3242. 设计相邻元素求和服务 本题纯模拟,代码如下ÿ…...
突破百度网盘的下载限速,两种方法教会你【超详细】
一、前言 Hello,大家后,我是博主英杰,前几天,我在使用百度网盘过程中,下载速度极慢,自己作为一个白嫖党,开会员也是心疼那点钱,所以在网上找了几个有效解决百度网盘限速问题的教程&a…...
整理 酷炫 Flutter 优质 布局、交互 开源App
xtimer-flutter-app Flutter 计时器应用 项目地址:https://github.com/pedromassango/xtimer-flutter-app 项目Demo:https://download.csdn.net/download/qq_36040764/89631382...
【PyCharm怎么同时打开多个项目】
问题描述: 之前点击了“dont ask again”,再也不能同时打开两个或多个项目了。 解决: file->settings->appearance->system settings->project->选择ask...
使用 ProcDump 调试 Linux
Debug Linux using ProcDump By Gaurav Kamathe July 17, 2020 译者:wxy 校对:wxy 微软越来越心仪 Linux 和开源,这并不是什么秘密。在过去几年中,该公司稳步地增加了对开源的贡献,包括将其部分软件和工具移植到 L…...
2023年中国城市统计年鉴(PDF+excel)
2023年中国城市统计年鉴 1、时间:1985-2023年 2、格式:PDFexcel 3、说明:中国城市统计年鉴收录了全国各级城市社会经济发展等方面的主要统计数据,数据来源于各城市的相关部门。本年鉴内容共分四个部分:第一部分是全…...
自用 K8S 资源对象清单 YAML 配置模板手册-1
Linux 常用资源对象清单配置速查手册-1 文章目录 1、Pod 容器集合2、Pod 的存储卷3、Pod 的容器探针4、ResourceQuota 全局资源配额管理5、PriorityClass 优先级类 管理多个资源对象清单文件常用方法: 使用 sed 流式编辑器批量修改脚本键值进行资源清单的创建&am…...
【数据库】事务 | 视图 | 自定义函数创建
1、事物及其特征 事物机制的应用:淘宝订单交易,微信转账等。 视图--------筛子---------过滤-------筛选想要的信息 数据库只存放了视图对应的SQL语句。 视图是一个虚拟的表,本质是一个虚拟的SQL命令集合。 (1)创建…...
Linux---进程(5)---进程地址空间
目录 预备知识 进程地址空间 什么是进程地址空间 为什么要存在进程地址空间和页表 缺页中断 预备知识 我们在学习语言的时候,一般都会了解到内存区域划分,下面了解一下Linux的内存区域划分。 通过上图,我们了解到 1、堆区向上增长&…...
C语言实现数据结构之队列
目录 队列一. 队列的概念及结构二. 队列的实现1. 要实现的功能2 具体的实现2.1 结构体2.2 初始化2.3 入队列2.4 出队列2.5 返回队首元素2.6 返回队尾元素2.7 队列元素个数2.8 队列判空2.9 队列销毁 三. 队列相关OJ题设计循环队列用队列实现栈用栈实现队列 四. 概念选择题五. 参…...
写一个Vue2和vue3的自定义指令(以复制指定作为示例)
文章目录 一、自定义指令是什么?二、自定义指令有啥用?三、自定义指令怎么用?1.自定义指令的参数2.自定义指令的钩子函数(1)五个钩子函数的说明(2)钩子函数的参数(主要参数:el和valu…...
nuScenes 与 nuImages 对比分析:两大数据集工具使用全攻略
nuScenes 与 nuImages 对比分析:两大数据集工具使用全攻略 【免费下载链接】nuscenes-devkit The devkit of the nuScenes dataset. 项目地址: https://gitcode.com/gh_mirrors/nu/nuscenes-devkit nuScenes 与 nuImages 是自动驾驶领域的两大重要数据集&…...
FireRedASR Pro多模态应用初探:结合视觉信息的音视频联合分析
FireRedASR Pro多模态应用初探:结合视觉信息的音视频联合分析 不知道你有没有过这样的经历:看一段访谈视频,总觉得单听声音或者单看画面,好像都差点意思。比如嘉宾明明在说“我很高兴”,但表情却有点勉强;…...
OFA模型与微信小程序结合:打造个人相册智能描述工具
OFA模型与微信小程序结合:打造个人相册智能描述工具 每次翻看手机相册,面对成百上千张照片,你是不是也常常想不起来某张照片是在哪里拍的、当时发生了什么?或者想给一张特别有感觉的照片配上一段文字发朋友圈,却总是词…...
GLM-4.1V-9B-Base在Web开发中的融合:Node.js后端服务集成实践
GLM-4.1V-9B-Base在Web开发中的融合:Node.js后端服务集成实践 1. 引言:当Node.js遇见多模态AI 想象一下,你的电商网站用户上传了一张商品图片,系统不仅能自动识别商品类别,还能生成吸引人的营销文案——这就是GLM-4.…...
STM8单片机外部晶振配置与故障排查指南
1. STM8单片机外部晶振配置基础STM8系列单片机作为意法半导体推出的8位微控制器,在工业控制、消费电子等领域应用广泛。其时钟系统设计灵活,支持内部RC振荡器和外部晶振两种时钟源。当我们需要更高精度的时钟信号或更高的工作频率时,通常会选…...
【2026必看】临沂销售增长咨询,哪家公司最权威?
在当前竞争激烈的市场环境中,商贸和生产型企业要想实现销售额的稳步增长,选择一家专业的管理咨询公司至关重要。那么,在临沂,哪家公司在销售增长咨询方面最具权威性呢?本文将为您详细解析,并推荐山东润行管…...
YOLOE开源镜像生产环境部署:YOLOE-v8m-seg在Docker Swarm集群实践
YOLOE开源镜像生产环境部署:YOLOE-v8m-seg在Docker Swarm集群实践 1. 引言:从单机到集群的跨越 如果你已经体验过YOLOE官版镜像在单台服务器上的强大能力,比如用文本描述就能识别图片里的任何物体,或者用一张示例图就能完成精准…...
IDC服务商快速上手命令合集
做idc服务商的,最主要就是对客户服务器进行维护,本篇文章主要就是将平常主要的维护操作,做一个合集,方便维护时快速调用。也方便欧云服务器的代理和各位同行朋友使用,降低难度。0、linux换源命令bash <(curl -sSL h…...
NAS部署New-API本地Ollama秒变公网OpenAI接口
用N1飞牛NAS部署New-API:本地Ollama秒变公网OpenAI接口 核心目标:将本地Ollama模型和各类云端API整合为一个统一的、支持公网访问的OpenAI格式接口。 一、核心解决痛点与方案 1.1 常见痛点 手里既有本地Ollama模型,又有零散的云端API…...
SIGMOD 2024论文解读:5篇向量检索新研究,从混合查询到Serverless数据库的实战启示
SIGMOD 2024向量检索技术实战指南:从混合查询到Serverless架构的工程化思考 当我们在构建下一代智能应用时,向量检索技术已经从实验室走向了生产环境的核心位置。今年SIGMOD会议上发布的几篇重量级论文,为这个快速发展的领域注入了新的活力。…...
