第11章 Express即时通讯简单集成

在现代 Web 应用中,实时通信变得越来越重要,特别是对于需要实时数据更新的应用,比如聊天应用、实时通知、在线游戏等。Express 是一个灵活且强大的 Web 框架,通过结合 WebSocket 和 Socket.IO,可以轻松实现实时通信功能。以下是关于如何在 Express 中使用 WebSocket 和 Socket.IO 实现实时通信的详细指南。

使用 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 的一部分,为客户端和服务器之间的实时双向通信提供了标准化的方式。

安装 WebSocket

要在 Node.js 中使用 WebSocket,首先需要安装 ws 模块,这是一个简单且快速的 WebSocket 实现。

npm install ws
设置 WebSocket 服务器

首先,创建一个基本的 Express 应用,然后在其基础上添加 WebSocket 支持。

const express = require('express');
const http = require('http');
const WebSocket = require('ws');const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });wss.on('connection', (ws) => {console.log('New client connected');ws.on('message', (message) => {console.log(`Received message => ${message}`);// Echo the message back to the clientws.send(`Server: ${message}`);});ws.on('close', () => {console.log('Client has disconnected');});
});server.listen(3000, () => {console.log('Server is listening on port 3000');
});

在这个示例中,WebSocket 服务器与 HTTP 服务器共享同一个端口(3000)。当有新的客户端连接时,服务器将记录连接信息并设置消息处理器和关闭处理器。

客户端实现

在客户端,通过 JavaScript 使用 WebSocket 进行连接和通信。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket Example</title>
</head>
<body><script>const ws = new WebSocket('ws://localhost:3000');ws.onopen = () => {console.log('Connected to the server');ws.send('Hello Server!');};ws.onmessage = (event) => {console.log(`Message from server: ${event.data}`);};ws.onclose = () => {console.log('Disconnected from the server');};</script>
</body>
</html>

客户端代码创建了一个新的 WebSocket 连接,并定义了打开连接、接收消息和关闭连接时的处理器。

使用 Socket.IO

Socket.IO 是一个流行的库,提供了一个简单的 API 来实现 WebSocket 和其他回退机制的实时双向通信。它比纯 WebSocket 提供了更多的功能和更好的兼容性。

安装 Socket.IO

首先需要安装 socket.io 模块:

npm install socket.io
设置 Socket.IO 服务器

与 WebSocket 类似,创建一个基本的 Express 应用,然后在其基础上添加 Socket.IO 支持。

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');const app = express();
const server = http.createServer(app);
const io = socketIo(server);io.on('connection', (socket) => {console.log('New client connected');socket.on('message', (message) => {console.log(`Received message => ${message}`);// Broadcast the message to all clientsio.emit('message', `Server: ${message}`);});socket.on('disconnect', () => {console.log('Client disconnected');});
});server.listen(3000, () => {console.log('Server is listening on port 3000');
});

在这个示例中,Socket.IO 服务器与 HTTP 服务器共享同一个端口(3000)。当有新的客户端连接时,服务器将记录连接信息并设置消息处理器和断开连接处理器。

客户端实现

在客户端,通过 JavaScript 使用 Socket.IO 进行连接和通信。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Socket.IO Example</title><script src="/socket.io/socket.io.js"></script>
</head>
<body><script>const socket = io('http://localhost:3000');socket.on('connect', () => {console.log('Connected to the server');socket.send('Hello Server!');});socket.on('message', (message) => {console.log(`Message from server: ${message}`);});socket.on('disconnect', () => {console.log('Disconnected from the server');});</script>
</body>
</html>

客户端代码通过 io 函数创建了一个新的 Socket.IO 连接,并定义了连接、接收消息和断开连接时的处理器。

在本章中,我们详细介绍了如何在 Express 中使用 WebSocket 和 Socket.IO 实现实时通信。WebSocket 提供了一种标准化的方式进行双向通信,而 Socket.IO 则提供了更丰富的功能和更好的兼容性。通过这些工具,开发者可以轻松实现各种实时通信功能,满足现代 Web 应用的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[OJ]水位线问题,1.采用回溯法(深度优先遍历求解)2.采用广度优先遍历求解

1.深度优先遍历 使用回溯法,深度优先遍历利用栈先进后出的特点,在加水控制水量失败时, 回到最近一次可对水进行加水与否的位置1.对于给定水量k,是否在[l,r]之间&#xff0c; 是:是否加水(加水y,用掉x,是否在[l,r]之间)(不加水y,用掉x,是否在[l,r]之间)先尝试加水&#xff0c;如…

Java 实现分页的几种方式详解

目录 分页概述Java实现分页的几种方式 手动分页基于JDBC的分页基于Hibernate的分页基于MyBatis的分页[基于Spring Data JPA的分页](#基于Spring Data JPA的分页)使用PageHelper插件的分页 分页中的注意事项总结 分页概述 分页是指将大量数据分成若干小块&#xff0c;每次只显…

NVIDIA全面转向开源GPU内核模块

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Logback原理及应用详解(三)

本系列文章简介&#xff1a; 在软件开发的过程中&#xff0c;日志记录是一项至关重要的功能。它不仅帮助开发者在开发阶段追踪代码的执行流程和调试问题&#xff0c;还在生产环境中扮演着监控应用运行状态、记录关键业务信息和排查故障的重要角色。随着软件系统的日益复杂和分布…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

python当键存在时向值添加元素,键不存在时则新建的简洁方法

在 Python 中&#xff0c;可以使用字典来存储集合对象&#xff0c;并且在键存在时向集合中添加元素&#xff0c;键不存在时则新建一个集合并添加元素。可以使用 dict.setdefault() 方法来简化这个过程&#xff0c;或者手动检查键是否存在。 下面是一些示例代码&#xff1a; 使…

音视频入门基础:WAV专题(2)——WAV格式简介

注&#xff1a;本文有部分内容引用了维基百科&#xff1a;https://zh.wikipedia.org/wiki/WAV 一、引言 Waveform Audio File Format&#xff08;缩写WAVE或WAV&#xff09;是微软与IBM公司所开发在个人电脑存储音频流的编码格式&#xff0c;在Windows平台的应用软件受到广泛的…

AI/机器学习(计算机视觉/NLP)方向面试复习3

1. Pooling 有哪些方式&#xff1f;pytorch的实现&#xff1f; Pooling可以分成&#xff1a;最大池化&#xff0c;平均池化&#xff0c;全局平均池化&#xff0c;随机池化&#xff0c;空间金字塔池化。 1. 最大池化&#xff08;Max Pooling&#xff09; 最大池化是最常用的池…

union的特性和大小端

一、union在c和c语言中的特性 1.共享内存空间&#xff1a;union的所有成员共享同一块内存空间。意味着在同一时刻&#xff0c;union 只能存储其成员 中的一个值。当你修改了union中的一个成员&#xff0c;那么其它成员的值也会被改变&#xff0c;因为它们实际上都是指向同一块…

JS逆向高级爬虫

JS逆向高级爬虫 JS逆向的目的是通过运行本地JS的文件或者代码,以实现脱离他的网站和浏览器,并且还能拿到和浏览器加密一样的效果。 10.1、编码算法 【1】摘要算法&#xff1a;一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑. 其特点就是小巧. 速度快. 极难被破解. 所以,…

skywalking docker部署

skywalking-oap # 拉取skywalking-oap镜像 docker pull apache/skywalking-oap-server:9.7.0# 启动容器 docker run --name oap \ -d \ -p 11800:11800 \ -p 12800:12800 \ apache/skywalking-oap-server:9.7.0skywalking-ui # 摘取skywalking-ui镜像 docker pull apache/sky…

大屏使用技巧——如何实现数据分发

当多个组件需共用同一数据源时&#xff0c;为了减少重复请求&#xff0c;需要进行数据分发。那如何实现接一次数据就能让多个组件映射同一数据源中的不同数据字段呢&#xff1f; 实现思路 目标组件的静态数据中添加标记字段&#xff0c;数据过滤器内通过 data 参数获取到对应…

加密micropython写的程序为.mpy的方法

2024年7月26日 用虚拟机安装一个Linux&#xff0c;本例为CentOS7的Linux系统。 1.保证Linux能够连接网络。 2.进入root用户&#xff0c;使用下面的命令行安装gcc编译器&#xff1a; yum install gcc 3.安装完成后&#xff0c;查看gcc是否安装成功&#xff0c;用下面的命令…

家政项目小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;家政人员管理&#xff0c;家政服务管理&#xff0c;咨询信息管理&#xff0c;咨询服务管理&#xff0c;家政预约管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能…

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…

C#中的泛型约束:如何利用泛型约束来提高代码的类型安全性和灵活性?

泛型约束是指可以对泛型类型参数进行限制&#xff0c;只允许特定类型或满足特定条件的类型作为泛型参数。使用泛型约束可以提高代码的类型安全性和灵活性&#xff0c;以下是一些常见的泛型约束及其作用&#xff1a; 类型约束&#xff08;class constraint&#xff09;&#xff…

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 加入课程 我们先看下加入课程 1.是否登录 2.课程是否存在 3.是否已经存在 4.添加 首先实现逻辑 def get_student_course(db: Session, course: int…

C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序

登录官网&#xff0c;在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载&#xff0c;因为服务器在国外&#xff0c;国内不支持&#xff0c;所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…

Github使用技巧

&#xff08;1&#xff09;基本操作&#xff1a; Github 点击绿色按键Code 复制地址&#xff0c;打开自己本地想要保存的文件夹&#xff0c;右键&#xff0c;Git Bach Here git clone 地址 --下载☆star:可以衡量该程序的热度和知名度README.md 是使用一个项目前必须要阅…

本地部署Graphhopper路径规划服务(graphhopper.sh启动版)

文章目录 文章参考源码获取一、配置Java环境变量二、配置Maven环境变量三、构建graphhopper步骤1. 下载数据2. 配置graphhopper配置文件config-example.yml3. 在项目中启动命令行执行./graphhopper.sh build3.1|、遇到的问题3.1.1、pom.xml中front-maven-plugin-无法下载npm6.1…