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

相關推薦

2024-01-10

于事件和语义消息流的网络应用层协议。 有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流

2024-01-12

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

2023-12-19

一、Socket.D 的主要特性 首先,Scoket.D 是高效一个二进制的网络通讯协议(官方的讲法是:基于事件和语义消息流的网络应用协议),能够满足很多场景下使用。其次,Scoket.D 是温和的响应式(采用回调风格)。 1、三种通

2023-12-07

有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http” 与其它协议的简单对比 对比项目 socket.d http websocket rsocket socket.io 发消息(Qos0) 有 无 有 有 有 发送并请求(Qos1) 有 有

2024-02-09

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

2024-01-04

有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http” 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,来回相关的消息会串成一个流 语言无关,使用二进制输传数

2023-12-05

有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http” 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,有相关的消息会串成一个流 语言无关,使用二进制输传数据

2024-01-23

Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议。有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。协议特点可参考《官网介绍》。 pyton 已开发完成,再在测试中;go, rust, c++ 正

2024-01-03

行" + "快照持久化" + "Broker 集群模式"(可选) 基于 Socket.D 网络应用协议 开发。全新设计,自主架构! 角色 功能 生产端 发布消息(Qos0、Qos1)、发布定时消息(Qos0、Qos1)、发布重试   &nb

2024-02-24

行" + "快照持久化" + "Broker 集群模式"(可选) 基于 Socket.D 网络应用协议 开发。全新设计,自主架构! 角色 功能 生产端 发布消息、定时消息、顺序消息、可过期消息、事务消息。发送请求(rpc)。

2023-04-06

编程)和 FRP(功能反应式编程)等元素。 Nest.js 9.4 正式发布,该版本更新内容如下: 功能 microservices 通过 TLS 连接到 TCP 微服务(TCP microservice over TLS) 错误修正 platform-ws 在不同路径上挂载多个 ws 服务器 p

2022-11-09

编程)和 FRP(功能反应式编程)等元素。 Nest.js 9.2 正式发布,该版本更新内容如下: 特性 common, core #10484 使用 API 将中间件应用于版本化路由: 错误修复 core #10459 fastify v4 需要返回响应 common, platform-express

2022-10-19

Node.js 19 在今天正式发布了,此次更新包括将 V8 JavaScript 引擎更新到 10.7,以及默认启用 HTTP(s)/1.1 KeepAlive。 Node.js 18 在本月晚些时候将进入长期支持(LTS),Node.js 19 将取代 Node.js 18 成为 "Current" 版本。 node --watch(实验性) 运

2024-01-18

行" + "快照持久化" + "Broker 集群模式"(可选) 基于 Socket.D 网络应用协议 开发。全新设计,自主架构! 角色 功能 生产端 发布消息(Qos0、Qos1)、定时消息(Qos0、Qos1)、可过期消息(Qos0、Qos1)