当前位置: 首页 > news >正文

用 Socket.D 替代原生 WebSocket 做前端开发

socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据,但功能更强大。

功能原生 websocketsocket.d说明
listen监听消息
send发消息
sendAndRequest发消息并接收一个响应(类似于 http)
sendAndSubscribe发消息并接收多个响应(也叫订阅)
event(or path)消息有事件或路径(可对消息,进行业务路由)
meta(or header)消息有元信息或头信息(可为数据,标注业务语义)
自动心跳
断开后自动重链

下面感受下开发方面的差异!

1、客户端示例代码

使用时,可以根据自己的业务对原生接口包装,进一步简化使用。

<script src="js/socket.d.js"></script>
<script>
async function init(){//构建事件监听const eventListener = await SocketD.newEventListener().doOnMessage((s,m)=>{//监听所有消息(可能不需要)}).doOn("/im/user.upline", (s,m)=>{ //事件的应用//监听用户上线let user_id = m.meta("user_id");}).doOn("/im/user.downline", (s,m)=>{//监听用户下线let user_id = m.meta("user_id"); //元信息的应用});//创建单例window.clientSession = SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2").listen(eventListener).open();
}function join(){clientSession.sendAndRequest("/user/join", SocketD.newEntity()).thenReply(r->{//加入成功});
}init();
</script>

Socket.D 有三个发消息的接口:

接口说明
send像 websocket。多了事件与元信息属性
sendAndRequest像 http
sendAndSubscribe像 reactive stream 。多了事件与元信息属性

2、服务端示例代码(用 java 演示)

public class Demo {public static void main(String[] args) throws Throwable {List<Session> userSessions = new ArrayList<Session>();//创建监听器Listener listener = new EventListener().doOnOpen(s->{//鉴权if("a".equals(s.param("u")) == false){s.close();}else{//加入用户表s.attrPut("user_id", s.param("u"));userSessions.add(s);}}).doOn("/user/join", (s,m)->{if(m.isRequest()){s.reply(m, new StringEntity());}for(Session s1: userSessions){//告诉所有用户,有人上线s1.send("/im/user.upline", new StringEntity().metaPut("user_id"), s.attr("userId"));}});//启动服务SocketD.createServer("sd:ws").config(c -> c.port(8602)).listen(listener).start();}
}

3、Socket.D 是什么东东?

Socket.D 是一个基于“事件”和“语义消息”“流”的网络应用层协议(听起来好像很 ao 口)。支持 tcp, udp, ws, kcp 传输(有各种不同语言的实现)。有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。

协议之所有强大,有三个关键基础因素:

  • 事件
  • 语义消息

它的帧码结构:

[len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)]

因为是应用层协议,所以可以建立在任意传输层协议之上。比如 websocket。

4、开源仓库

  • github: https://github.com/noear/socket.d
  • gitee: https://gitee.com/noear/socket.d

相关文章:

用 Socket.D 替代原生 WebSocket 做前端开发

socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据&#xff0c;但功能更强大。 功能原生 websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应&#xff08;类似于 http&#xff09;sendAndSubscribe无…...

Transformer架构和对照代码详解

1、英文架构图 下面图中展示了Transformer的英文架构&#xff0c;英文架构中的模块名称和具体代码一一对应&#xff0c;方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看&#xff0c;Transformer的编码器是由多个相同的层叠加⽽ 成的&#xff0c;每个…...

大数的乘法

题目描述 求两个不超过100位的非负整数的乘积。 输入 有两行&#xff0c;每行是一个不超过100位的非负整数&#xff0c;没有多余的前导0。 输出 一行&#xff0c;相乘后的结果。 样例输入 Copy 123456789 123456789样例输出 Copy 15241578750190521 代码实现&#xff1…...

年度征文 | 机器学习之心的2023

机器学习之心的2023 2023是极其复杂的一年。 生活上&#xff0c;养了很多宠物。 工作上&#xff0c;写了不少博客。 虽然遇见更多让人不开心的事情&#xff0c;但总体还是美好的。 愿大家新的一年健康平安&#xff0c;生活幸福&#xff01; 机器学习是一项庞大的工程&#xff0…...

13.Kubernetes应用部署完整流程:从Dockerfile到Ingress发布完整流程

本文以一个简单的Go应用Demo来演示Kubernetes应用部署的完整流程 1、Dockerfile多阶段构建 Dockerfile多阶段构建 [root@docker github]# git clone https://gitee.com/yxydde/http-dump.git [root@docker github]# cd http-dump/ [root@docker http-dump]# cat Dockerfile …...

多年后再用TB,谈项目管理工具

背景 最近启动一个小项目&#xff0c;多年未曾使用项目管理工具&#xff0c;依稀记得使用过Basecamp,Tower,worktitle,teambition等等&#xff0c;当然还有mantis&#xff0c;vs project等等。于是随便翻阅找个用&#xff0c;不小心翻了TB的牌子&#xff0c;竟然已是阿里旗下的…...

Spark MLlib ----- ALS算法

补充 在谈ALS(Alternating Least Squares)之前首先来谈谈LS,即最小二乘法。LS算法是ALS的基础,是一种数优化技术,也是一种常用的机器学习算法,他通过最小化误差平方和寻找数据的最佳匹配,利用最小二乘法寻找最优的未知数据,保证求的数据与已知的数据误差最小。LS也被用…...

ubuntu桥接方式上网

vmvare:VMware Workstation 17 Pro ubuntu: Ubuntu 14.04.6 LTS window10 下面是我的电脑配置 下面是ubuntu虚拟机的配置 vi /etc/network/interfaces 下面的gateway就是window -ipconfig 截图里的默认网关 auto lo iface lo inet loopbackauto eth0 iface eth0 inet stat…...

收到的字符串写入xml并且将这个xml写入.zip文件中

文章目录 1、将数据写入xml文件WriteToXmlFile2、将xml文件写入zip压缩文件AddToZip3、组合起来4、使用到的头文件和动态库 1、将数据写入xml文件WriteToXmlFile void CSMSLoginDlg::WriteToXmlFile(const std::string& responseData, const std::string& xmlFileName…...

【读书笔记】《白帽子讲web安全》跨站脚本攻击

目录 前言&#xff1a; 第二篇 客户端脚本安全 第3章 跨站脚本攻击&#xff08;XSS&#xff09; 3.1XSS简介 3.2XSS攻击进阶 3.2.1初探XSS Payload 3.2.2强大的XSS Payload 3.2.2.1 构造GET与POST请求 3.2.2.2XSS钓鱼 3.2.2.3识别用户浏览器 3.2.2.4识别用户安装的软…...

第九节 初始化项目

系列文章目录 目录 系列文章目录 前言 操作方法 总结 前言 初始化项目,导入默认reset.scss 、variables.scss及mixins.scss等并修改main.js引入样式 操作方法 将默认样式表文件导入到项目。样式文件已经放到资源里请自行下载(...

【论文阅读】深度学习中的后门攻击综述

深度学习中的后门攻击综述 1.深度学习模型三种攻击范式1.1.对抗样本攻击1.2.数据投毒攻击1.3.后门攻击 2.后门攻击特点3.常用术语和标记4.常用评估指标5.攻击设置5.1.触发器5.1.1.触发器属性5.1.2.触发器类型5.1.3.攻击类型 5.2.目标类别5.3.训练方式 1.深度学习模型三种攻击范…...

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?

在 Spring 中&#xff0c;Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时&#xff0c;该方法将在单独的线程中执行&#xff0c;而不会阻塞当前线程。这使得方法可以在后台执行&#xff0c;而不会影响主线程的执行。 在您提供的代码示例中&#xff0c;a1() 和…...

Vue_00001_CLI

初始化脚手架 初始化脚手架步骤&#xff1a; 第一步&#xff08;仅第一次执行&#xff09;&#xff1a;全局安装vue/cli。 命令&#xff1a;npm install -g vue/cli 第二步&#xff1a;切换到要创建项目的目录&#xff0c;然后使用命令创建项目。 命令&#xff1a;vue creat…...

kubernetes ResourceQuotas Limits(资源配额)

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 简介 当多个用户或团队共享具有固定节点数目的集群时&#xff0c;人们会…...

【ARMv8架构系统安装PySide2】

ARMv8架构系统安装PySide2 Step1. 下载Qt资源包Step2. 配置和安装Qt5Step3. 检查Qt-5.15.2安装情况Step4. 安装PySide2所需的依赖库Step5. 下载和配置PySide2Step6. 检验PySide2是否安装成功 Step1. 下载Qt资源包 if you need the whole Qt5 (~900MB): wget http://master.qt…...

ECMAScript6详解

ECMAScript 6&#xff0c;也被称为 ES6 或 ECMAScript 2015&#xff0c;是 JavaScript 编程语言标准的一个主要更新。它于 2015 年正式发布&#xff0c;并带来了许多新特性和改进&#xff0c;使得 JavaScript 开发更加现代化和高效。下面是 ES6 的一些关键特性的详解&#xff1…...

[C#]使用PaddleInference图片旋转四种角度检测

官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, Ma…...

stable diffusion 基础教程-提示词之光的用法

基图 prompt: masterpiece,best quality,1girl,solo,looking at viewer,brown hair,hair between eyes,bangs,very long hair,red eyes,blush,bare shoulders,(white sundress),full body,Negative prompt: EasyNegative,badhandv4,nsfw,lowres,bad anatomy,bad hands,text…...

第9课 回声抑制(AEC+AGC+ANS)的实现

在第8课中&#xff0c;我们将推流端与播放端合并实现了一对一音视频聊天功能&#xff0c;一切看起来还不错。但在实际使用时&#xff0c;会遇到一个烦心的问题&#xff1a;说话时会听到比较大的回声&#xff0c;影响正常使用。所以&#xff0c;这节课我们来重点解决这个问题。 …...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...