【NodeJS】nodejs提供websocket服务

背景

在开发业务系统的时候,根据开发人员不同的技术栈,会使用不同的技术来开发微服务。本文是基于NodeJS提供的websocket的服务。在websocket通过分片的方式将字符串进行切割传递。

正文

1、源码

server.js:

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket) => {  console.log('Client connected');// 模拟分片传输  var message = 'Hello, WebSocket!数据映射的方式有两种:';  console.log(message.length);   const chunkSize = 5;  const totalChunks = Math.ceil(message.length / chunkSize);for (let i = 0; i < totalChunks; i++) {  const start = i * chunkSize;  const end = i === totalChunks - 1 ? message.length : start + chunkSize;  const chunk = message.slice(start, end);socket.send(chunk);  console.log(`Sending chunk ${i + 1}/${totalChunks} - ${chunk}`);  }socket.on('close', () => {  console.log('Client disconnected');  });  
});console.log('Server is running on port 8080'); 

client.js:

const WebSocket = require('ws');const ws = new WebSocket('ws://localhost:8080');ws.on('open', () => {  console.log('连接已建立');// 发送握手请求  ws.send(  JSON.stringify({  Upgrade: 'websocket',  Connection: 'Upgrade',  //Sec_WebSocket_Accept: createSecWebSocketAccept(ws),  })  );// 发送分片消息  const message = 'Hello, WebSocket!';  const parts = chunk(message, 1024);  parts.forEach((part, index) => {  ws.send(JSON.stringify({ type: 'split', parts: [part], index: index }));  });// 接收响应  ws.on('message', (message) => {  //const data = JSON.parse(message);  //if (data.type === 'response') {  console.log('接收到的响应:', message);  //}  });// 关闭连接  ws.on('close', () => {  console.log('连接已关闭');  });  
});function chunk(str, size) {  const chunks = [];  for (let i = 0; i < str.length; i += size) {  chunks.push(str.slice(i, i + size));  }  return chunks;  
}function createSecWebSocketAccept(ws) {  const key = ws.url.split('=').pop();  const AcceptKey = WebSocket.createSecureContext().SecureSocket.prototype.sec_websocket_accept;  return AcceptKey.replace('$WS_KEY$', key);  
}

2、运行

1>、启动server.js

执行命令:

node server.js

运行效果:

2>、启动client.js

执行命令:

node client.js

运行效果:

客户端:

服务端:

3、扩展

Nodejs提供http服务,参考如下案例:

const http = require("http");const hostname = "127.0.0.1";
const port = 3000;
//创建HTTP服务器,并提供两个对象,一个请求(http.IncomingMessage对象)和一个
//响应(http.ServerResponse对象)
const server = http.createServer((req, res) => {res.statusCode = 200;//设置statusCode属性为200,以表相应成功res.setHeader("Content-Type", "text/plain");//设置Content-Type响应头res.end("Hello World1111\n");//关闭响应,添加内容作为end()的参数
})
//服务器启动监听
server.listen(port, hostname, () => {console.log(`服务器运行在http://${hostname}:${port}/`);
})

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

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

相关文章

PDF有编辑密码怎么办

目录 注意&#xff1a; windows方法&#xff1a; 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法&#xff1a; 注意&#xff1a; 此方法可以用于破解PDF的编辑密码&#xff0c;而不是PDF的打开密码 当遇到类似如下问…

分子动力学模拟—LAMMPS 模拟(固体和液体)数据后处理软件(六)

记录一下检索到一篇分子动力学模拟数据后处理的软件。 感谢论文的原作者&#xff01; 主要功能&#xff1a; Structure Analysis Ackland Jones Analysis CentroSymmetry Parameter Common Neighbor Analysis Common Neighbor Parameter Atomic Structure Entropy Stein…

汽车生产污废水处理需要哪些工艺设备

对于汽车生产过程中产生的污废水处理&#xff0c;需要运用一系列的工艺设备来实现有效的清洁和回收利用。下面让我们一起来探索一下吧&#xff01; 首先&#xff0c;汽车生产工艺设备中最常见的是物理处理设备。物理处理包括沉淀、过滤和吸附等过程。其中&#xff0c;沉淀操作可…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…

Web3与环保:区块链如何推动可持续发展

随着气候变化和环境问题日益严峻&#xff0c;社会对可持续发展的需求变得愈发迫切。在这个背景下&#xff0c;Web3技术和区块链崭露头角&#xff0c;成为推动可持续发展的关键力量。本文将深入探讨Web3技术如何与环保理念相结合&#xff0c;引领我们迈向更加可持续的未来。 1. …

2024年【G1工业锅炉司炉】考试题及G1工业锅炉司炉理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G1工业锅炉司炉考试题为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题&#xff0c;每个月更新的G1工业锅炉司炉理论考试祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGZ6001-2019《特种设备作业人…

JAVA实现向Word模板中插入Base64图片和数据信息

目录 需求一、准备模板文件二、引入Poi-tl、Apache POI依赖三、创建实体类&#xff08;用于保存向Word中写入的数据&#xff09;四、实现Service接口Controller层实现 需求 在服务端提前准备好Word模板文件&#xff0c;并在用户请求接口时服务端动态获取图片。数据等信息插入到…

力扣hot100 完全平方数 完全背包 滚动数组 四平方和定理

Problem: 279. 完全平方数 文章目录 思路&#x1f496; 完全背包&#x1f496; 滚动数组优化&#x1f496; 四平方和定理 思路 &#x1f468;‍&#x1f3eb; 三叶神解 &#x1f468;‍&#x1f3eb; 数学解法 &#x1f496; 完全背包 ⏰ 时间复杂度: O ( n 2 n ) O(n^2 …

Python-基础篇-类与对象/面向对象程序设计

文章目录 思维导图是何物类定义类&#x1f4da; class类的成员&#x1f4da;类的继承性&#x1f4da;封装性&#x1f4da;多态性 对象面向对象&#x1f4da;创建对象&#x1f4da;销毁对象&#x1f4da; 类和对象关系必背必记专业英语学习角 思维导图 是何物 类 “类”是物以…

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

这是【Flutter 问题系列第 80 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 博文当前所用 Flutter SDK&#xff1a;3.10.5、Dart SDK&#xff1a;3.0.5 一&#xff1a;问题描述 在输入用户名称、简介等内容时&#xff0c;一般我们都会限制输入框内最大可输入…

VueSupercharge 精通指南:构建超级状态管理 Vue.js 应用

一、介绍 1.1 Vuex 是什么 &#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 1.2 什么是“状态管理模式”&#xff1f; 这个状态自管理应用…

GPT APP的开发步骤

开发一个GPT&#xff08;Generative Pre-trained Transformer&#xff09; Store&#xff08;存储&#xff09;涉及到使用预训练的语言模型&#xff08;例如GPT-3&#xff09;来生成和管理内容。以下是一般的步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&…