Socket.D v2.3.9 发布(增加 node.js server 适配)

2024-02-01 00:04

本文主要是介绍Socket.D v2.3.9 发布(增加 node.js server 适配),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Socket.D

是基于"事件"和"语义消息""流"的网络应用层传输协议。有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。协议特点可参考《官网介绍》。

pyton 已开发完成,再在测试中;go, rust, c++ 正在开发中。

for Java 适配框架更新说明:

  • 添加 CLOSE28_OPEN_FAIL 关闭码,优化关闭处理
  • 调整 SocketD.createXxx 的异常提示,带上协议架构信息
  • 调整 PathListener::of 更名为 doOf,并添加 of 函数(应用不同)

for JavaScript 适配框架更新说明:

  • 完成 for Node.js server 实现!!!
  • 添加 Session::remoteAddress,localAddress 方法
  • 添加 CLOSE28_OPEN_FAIL 关闭码,优化关闭处理
  • 调整 SocketD.createXxx 的异常提示,带上协议架构信息
  • 调整 PathListener::of 更名为 doOf,并添加 of 函数(应用不同)

新增的接口体验(for Node.js Server):

现在服务端可以用 java 也可以用 node.js(很快也可以用 python 了) 。for Node.js Server Demo:

  • 包配置
{"name": "demo","description": "socket.d for node.js demo","author": "noear","dependencies": {"@noear/socket.d": "2.3.9","ws": "^8.16.0"}
}
  • 服务端示例代码
const {SocketD}  = require('@noear/socket.d');function main(){let server = SocketD.createServer("sd:ws").config(c => c.port(8602).fragmentSize(1024 * 1024)).listen(buildListener()).start();
}function buildListener() {return SocketD.newEventListener().doOnOpen(s => {console.info("onOpen: " + s.sessionId());}).doOnMessage((s, m) => {console.info("onMessage: " + m);}).doOn("/demo", (s, m) => {if (m.isRequest()) {s.reply(m, SocketD.newEntity("me to!"));}if (m.isSubscribe()) {let size = m.rangeSize();for (let i = 1; i <= size; i++ ) {s.reply(m, SocketD.newEntity("me to-" + i));}s.replyEnd(m, SocketD.newEntity("welcome to my home!"));}}).doOn("/upload", (s, m) => {if (m.isRequest()) {let fileName = m.meta(SocketD.EntityMetas.META_DATA_DISPOSITION_FILENAME);if (fileName) {s.reply(m, SocketD.newEntity("no file! size: " + m.dataSize()));} else {s.reply(m, SocketD.newEntity("file received: " + fileName + ", size: " + m.dataSize()));}}}).doOn("/download", (s, m) => {if (m.isRequest()) {let fileEntity = SocketD.newEntity("...");//todo://SocketD.newEntity(fs.readFileSync("/Users/noear/Movies/snack3-rce-poc.mov"));s.reply(m, fileEntity);}}).doOn("/push", (s, m) => {if (s.attrHas("push")) {return;}s.attrPut("push", "1");for (let i = 0; i++; i < 100) {if (s.attrHas("push") == false) {break;}s.send("/push", SocketD.newEntity("push test"));//todo:sleep}}).doOn("/unpush", (s, m) => {s.attrMap().remove("push");}).doOnClose(s => {console.info("onClose: " + s.sessionId());}).doOnError((s, err) => {console.warn("onError: " + s.sessionId());});
}main();

Socket.D.js 客户能力演示:

  • 监听(相当于 ws 的增强)

多了事件路由。可以用一个连接,监听不同的业务事件(类似于 http path)。

//打开客户端会话(用 url 形式打开)
let session = await SocketD.createClient("sd:ws://127.0.0.1:8602/?token=1b0VsGusEkddgr3d").listen(SocketD.newEventListener().doOnOpen(s -> { //会话打开时//...}).doOnMessage((s, m) -> { //收到任意消息时//打印console.info(m);}).doOn("/demo", (s, m) -> { //收到"/demo"事件的消息时if (m.isRequest() || m.isSubscribe()) {//答复s.replyEnd(m, SocketD.newEntity("And you too."));}})).open();
  • 发送 和 发送文件(并获取进度)

发送相对于 ws 多了元信息。可为数据添加额外的业务标注。发送大数据时,会自动分片(接收端自动聚合)

//发送
session.send("/demo/hello", SocketD.newEntity("hi").metaPut("sender","noear"));//发送文件,且获取发送进度(如果有大数据发送,又需要显示进度)//实际开发,要用 sendAndRequest 接口(以获取接收确认)
session.send("/demo/upload", SocketD.newEntity(file)).thenProgress((isSend, val, max)=>{if(isSend){//获取发送进度console.info(`...${val}/${max}`);}
});
  • 请求 和 下载文件(或大数据块)

这个相当于 ws 有了 ajax 的交互方式

//发送并请求(有点像 ajax)
let reply = session.sendAndRequest("/demo/hello", SocketD.newEntity()).thenReply(reply=>{console.info(reply.dataAsString());
});//发送并请求,且取接收进度(如果有大数据获取,又需要显示进度)
session.sendAndRequest("/demo/download", SocketD.newEntity()).thenProgress((isSend, val, max)=>{if(!isSend){//获取接收进度console.info(`...${val}/${max}`);}
}).thenReply(reply=>{//reply.data()...
}).thenError(err=>{//如果有出错?
});
  • 订阅 与 流量控制(一般用于流加载)

通过 range(start, size) 指定数据范围,由 sendAndSubscribe 发起订阅,通过 thenReply 多次接收。

//发送并订阅
let entity = SocketD.newEntity().range(5,5).metaPut("videoId","1");
session.sendAndSubscribe("/demo/stream", entity).thenReply(reply=>{//异步获取答复(会多次回调)
})

视频演示效果:

  • for H5
    • https://www.bilibili.com/video/BV1ck4y197BV/
    • 演示源码
  • for UniAPP
    • https://www.bilibili.com/video/BV1T94y1T7sp/
    • 演示源码

代码仓库:

  • https://gitee.com/noear/socketd
  • https://github.com/noear/socketd

官网:

  • https://socketd.noear.org

这篇关于Socket.D v2.3.9 发布(增加 node.js server 适配)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665480

相关文章

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片