前端面试练习24.3.6

前言:

今天就是复习回顾一下websocket,之前有个AI项目使用到了这个,有点久远了,回顾一下大致过程和难点。

一些知识点:

1.单工,半双工,全双工

单工:

数据只能沿着一个方向传递,例如电视广播等。

优点:实现简单

缺点:传输效率低

半双工:

数据可以在双方之间进行传递,但是不能同时进行,必须有个 发送/接收 角色的转换,一方发送完成另一方才能发送。比如对讲机。

全双工:

数据可以同时在两个方向上传输,通信的两个设备之间可以同时的收发消息,无需等待对方完成,极大地提高了数据的传输效率,典型用例就是电话。

websocket实战:

服务端创建websocket服务

创建node项目,安装相关依赖

npm init -y
npm install express
npm install ws
const WebSocket = require('ws');
const PORT = 8080;
const wss = new WebSocket.Server({ port: PORT });
const clients = new Map();wss.on('connection', function connection(ws) {console.log('Client connected');ws.on('message', function incoming(message) {const data = JSON.parse(message);let targetUser = data.toUser// 如果客户端之前没有存储在 clients Map 中,则存储客户端连接if (!clients.has(data.user)) {clients.set(data.user, ws);}console.log(clients.keys())// 将格式化后的消息发送给客户端const formattedMessage = `${data.user}:  - ${data.time}<br>${data.message}`;if (clients.has(targetUser)) {ws.send(formattedMessage);const clientSocket = clients.get(targetUser);// 检查连接是否已经打开if (clientSocket.readyState === WebSocket.OPEN) {// 发送消息给目标用户clientSocket.send(formattedMessage);} else {clientSocket.send(`连接到用户 ${targetUser} 的WebSocket已关闭。`);}} else {ws.send(`用户 ${targetUser} 不在线或未连接到WebSocket服务器。`);}console.log('Received:', formattedMessage);});// 当完成后释放连接回连接池// webSocketPool.releaseConnection(connection);
});console.log('WebSocket server is running on port 8080');
console.log(`WebSocket 服务器正在监听 127.0.0.1:${PORT}`);

客户端编写连接代码

<!DOCTYPE html>
<html><head><meta charset='utf-8'><title>前端学习</title><style>* {margin: 0px;padding: 0px;}</style>
</head><body>写一个聊天显示的窗口,以及信息发送输入框和发送按钮<div id='chat' style="display: flex;justify-content: space-around;"><div class="box1"><div id='user1_messages' style="width: 600px;height: 300px;border:1px solid black"><h1>WebSocket1 user:<span id="user1_h1" style="color: rgb(232, 154, 66);"></span></h1></div><input type='text' id='messageInput1' autocomplete='off' placeholder='Type your message here...'><button id='sendButton1'>Send</button></div><div class="box2"><div id='user2_messages' style="width: 600px;height: 300px;border:1px solid black"><h1>WebSocket2 user:<span id="user2_h1" style="color: rgb(232, 154, 66);"></span></h1></div><input type='text' id='messageInput2' autocomplete='off' placeholder='Type your message here...'><button id='sendButton2'>Send</button></div></div><script type='text/javascript'>let data = [{user: 'xhc',message: '',time: '',toUser:''}, {user: 'slj',message: '',time: '',toUser:''},{user: 'aaa',message: '',time: '',toUser:''}]let mess1 = document.getElementById('user1_messages');let mess2 = document.getElementById('user2_messages');let user1_h1 = document.getElementById('user1_h1');user1_h1.innerHTML = `${data[0].user}`let input1 = document.getElementById('messageInput1');let input2 = document.getElementById('messageInput2');let user2_h1 = document.getElementById('user2_h1');user2_h1.innerHTML = `${data[1].user}`let send1 = document.getElementById('sendButton1');let send2 = document.getElementById('sendButton2');const URL = 'ws://localhost:8080'const connect1 = () => {// 创建 WebSocket 连接const socket = new WebSocket(URL);// 当连接打开时执行的操作socket.onopen = function (event) {console.log('WebSocket1 连接已建立');data[0].message = input1.valuedata[0].time = new Date().toLocaleString()data[0].toUser = 'slj'// 发送消息到服务器socket.send(JSON.stringify(data[0]));input1.value = '';};// 当接收到消息时执行的操作socket.onmessage = function (event) {let reply = event.datamess1.innerHTML = `${mess1.innerHTML} <br>${reply}`;console.log('来自服务器的消息1:', reply);};// 当连接关闭时执行的操作socket.onclose = function (event) {mess1.innerHTML = 'WebSocket1 连接已关闭'console.log('WebSocket1 连接已关闭');};}send1.addEventListener('click', connect1)const connect2 = () => {// 创建 WebSocket 连接const socket = new WebSocket(URL);// 当连接打开时执行的操作socket.onopen = function (event) {console.log('WebSocket2 连接已建立');data[1].message = input2.valuedata[1].time = new Date().toLocaleString()data[1].toUser = 'xhc'// 发送消息到服务器socket.send(JSON.stringify(data[1]));input2.value = '';};// 当接收到消息时执行的操作socket.onmessage = function (event) {mess2.innerHTML = `${mess2.innerHTML} <br>${event.data}`;console.log('来自服务器的消息2:', event.data);};// 当连接关闭时执行的操作socket.onclose = function (event) {mess2.innerHTML = 'WebSocket2 连接已关闭'console.log('WebSocket2 连接已关闭');};}send2.addEventListener('click', connect2)</script>
</body></html>

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

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

相关文章

项目打包至私有maven仓库

文章目录 step1: 下载源项目到本地&#xff0c;确保编译无问题step2: maven配置文件settings.xmlstep 3: 项目的pom.xml配置要发布的仓库地址step 4: 执行deploy命令即可将项目打包至远程仓库 step1: 下载源项目到本地&#xff0c;确保编译无问题 step2: maven配置文件setting…

线性代数笔记11--矩阵空间、秩1矩阵

1. 矩阵空间 所有的 3 3 3 \times 3 33矩阵构成的空间 M M M。 考虑空间 M M M的子空间 上三角矩阵对称矩阵对角矩阵 3 x 3 3x3 3x3矩阵空间的基: [ 1 0 0 0 0 0 0 0 0 ] [ 0 1 0 0 0 0 0 0 0 ] [ 0 0 1 0 0 0 0 0 0 ] [ 0 0 0 1 0 0 0 0 0 ] [ 0 0 0 0 1 0 0 0 0 ] [ 0 0 …

Vector Search和专用Search Nodes:现已正式发布

我们非常高兴地推出了 Atlas Vector Search 和 Search Nodes 的正式发布版本 (GA)&#xff0c;为 Atlas 平台增添了更多价值。 自从在公开预览版中发布 Atlas Vector Search 和带有 Search Nodes 的专用基础架构以来&#xff0c;我们注意到&#xff0c;对于使用向量优化搜索节…

【Python 常用脚本及命令系列 2.4 -- 如何使用 .pyc 文件】

文章目录 如何使用 .pyc 文件 如何使用 .pyc 文件 在 Python中&#xff0c;.pyc文件是由Python源文件.py编译生成的字节码文件。这些文件通常不包含可以直接阅读的源代码&#xff0c;但是可以由Python解释器直接执行。如果别人给了你一个.pyc文件&#xff0c;你可以按照以下步…

信息安全、网络安全以及数据安全三者之间的区别

随着信息技术的飞速发展&#xff0c;网络安全、信息安全、数据安全等词汇在平时出现的频率越来越高&#xff0c;尤其是数据安全&#xff0c;是大家都关心的一个重要话题。事实上&#xff0c;有很多人对网络安全、信息安全、数据安全的概念是区分不清的&#xff0c;下面由我帮大…

js 将对象转换为数组,两个对象的属性相同合并相加

1、定义两个对象&#xff0c;属性相同的值相加&#xff0c;并将值赋值为数组中对象属性相同的 定义数组 var titleDate [{name: JKJInputQty,field: restQty,icon: config.ossUrl /afl-data-screen/images/icon-all-input.png,value: 0,titleNames: JKJInputQty,span: 3}, …

分布式概念-理论篇

分布式是一个描述计算机系统或应用架构的术语&#xff0c;它指的是将一个大型的系统或服务拆分成多个小的、独立的子系统或服务&#xff0c;这些子系统或服务可以在不同的计算机或服务器上运行&#xff0c;并通过网络进行通信和协作&#xff0c;从而共同完成整个系统的功能。 …

C#,回文分割问题(Palindrome Partitioning Problem)算法与源代码

1 回文串 “回文串”是一个正读和反读都一样的字符串&#xff0c;初始化标志flagtrue&#xff0c;比如“level”或者“noon”等等就是回文串。 2 回文分割问题 给定一个字符串&#xff0c;如果该字符串的每个子字符串都是回文的&#xff0c;那么该字符串的分区就是回文分区。…

DataLoader

import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 准备的测试数据集 数据放在了CIFAR10文件夹下test_data torchvision.datasets.CIFAR10("./CIFAR10",trainFalse, transformtorchvision.transfor…

Qt入门(一)Qt概述

Qt是什么&#xff1f; Qt是一个跨平台应用开发框架。 Qt既包括了一系列的Qt库&#xff0c;还包括诸多配套的开发工具如QtCreater&#xff0c;GUI Designer。Qt本身是由C开发的&#xff0c;但是也提供了其他编程语言的接口。 Qt的定位以及同类 学一种技术&#xff0c;最重要的是…

PDF控件Spire.PDF for .NET【安全】演示:加密 PDF 文档

加密PDF是人们常用的保护PDF的方法。无论对于公司还是个人&#xff0c;使用PDF加密来设置一些限制都是必不可少的。为了使PDF文档可供未经授权的用户阅读但无法修改&#xff0c;加密的PDF文档需要两个密码&#xff1a;所有者密码和用户密码。本节将特别介绍一种通过 Spire.PDF …

从mysql 数据库表导入数据到elasticSearch的几种方式

从MySQL数据库导入数据到Elasticsearch有几种方式&#xff0c;主要包括以下几种&#xff1a; 1. 使用Logstash&#xff1a; Logstash是一个开源的数据收集引擎&#xff0c;可以用来从不同的数据源导入数据到Elasticsearch。它具有强大的数据处理能力和插件生态系统&…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

scanf从缓冲区读值、检查缓冲区与读取失败

先看一段代码&#xff1a;代码① #include <Windows.h> int main() { int n 0; while (scanf( "%d", &n) ! EOF) // 如果输入a死循环 { printf( "b\n"); //getchar(); Sleep(1000); } return 0; } 此程序的输出结果是 输出…

透明多级分流系统(用户端缓存和负载均衡)

部件考虑 有些设备位于客户端或者网络边缘&#xff0c;能够迅速响应用户请求&#xff0c;避免给cpu和数据库带来压力&#xff0c;比如&#xff0c;本地缓存&#xff0c;内容分发网络&#xff0c;反向代理等。 有些设备处理能力能够线性扩展&#xff0c;易于伸缩&#xff0c;应…

探索程序员职业迷宫:选择适合自己的职业赛道

作为现代社会中备受青睐的职业之一&#xff0c;程序员的职业赛道就如同一座错综复杂的迷宫&#xff0c;充满了挑战与机遇。在这个迷宫中&#xff0c;有着前端的绚丽花园、后端的神秘洞穴以及数据科学的深邃密室&#xff0c;每一条路径都蕴藏着无限可能和发展空间。而如何选择适…

代码随想录Day22 | Leetcode39 组合总和、Leetcode40 数组总和II | Leetcode131 分割回文串

上题 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 第一题 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找…

ChatGPT聊天机器人数据隐私和安全问题

ChatGPT是否安全使用&#xff1f; 是的&#xff0c;ChatGPT是安全的&#xff0c;因为它无法对你或你的计算机造成任何直接损害。由于网页浏览器和智能手机操作系统都使用了沙箱技术&#xff0c;因此ChatGPT无法访问你设备的其余部分。换句话说&#xff0c;当你使用ChatGPT应用程…

node.js中path.join() 和 path.resolve()

《Node.js》path.resolve与path.join的区别与作用_js path.resolve-CSDN博客

Sentinel 面试题及答案整理,最新面试题

Sentinel的流量控制规则有哪些&#xff0c;各自的作用是什么&#xff1f; Sentinel的流量控制规则主要包括以下几种&#xff1a; 1、QPS&#xff08;每秒查询量&#xff09;限流&#xff1a; 限制资源每秒的请求次数&#xff0c;适用于控制高频访问。 2、线程数限流&#xf…