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
- for UniAPP
代码仓库:
官网:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kunlun-admin v1.4.2 发布,昆仑管理系统
SpringCloud前后端分离微服务版昆仑管理系统 v1.4.2 发布! 更新日志 1、升级 SpringCloud 及SpringBoot 版本后适配改造; 2、升级 Java 17 版本后适配改造; 3、前端组件升级后适配改造; 4、优化并修复前端及后端若干问题。 系统介绍 昆仑管理系统是一套基于前后端分离架构的后台管理系统。kunlun-web 基于 React + Umi (乌米) + Ant Design (蚂蚁金服) 构建开发,提供前端解决方案;kunlun-service 基于 SpringBoot 与 Spring Cloud 构建开发,提供后端基于微服务架构的解决方案。系统通过 Apache Shiro 与 Jwt 组件,用 token 进行数据交互认证,可快速开发并独立进行 Docker 容器化部署。 使用说明 1. npm 安装前端依赖库,并启动 kunlun-home-web 与 kunlun-system-web 服务; 2. 安装并启动 PostgreSQL; 3. 安装并启动 RabbitMQ 和 Redis; 4. 启动注册中心服务 kunlun-re...
- 下一篇
React Native 0.73.3 发布
React Native 0.73.3 现已发布,具体更新内容如下: Added iOS specific 查找 codegen 声明时处理 TSAsExpression (02957718d7) Changed 将 CLI 升级到 12.3.2(bcb229e8f8) Android specific 在 ReactActivity 的 onRequestPermissionsResult() 中调用 super.onRequestPermissionsResult (96ed1190c6) iOS specific 从 react_native_post_install 中移除 ATS 配置补丁(41c601e478) Fixed 声明缺少的 dependencychalk(9155e2d182) TouchableBounce, TouchableHighlight and TouchableNativeFeedback dropping touches with React 18。(e4708d661b) TouchableWithoutFeedback and Touchab...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音