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:

  • 包配置
javascript 复制代码
{
  "name": "demo",
  "description": "socket.d for node.js demo",
  "author": "noear",
  "dependencies": {
    "@noear/socket.d": "2.3.9",
    "ws": "^8.16.0"
  }
}
  • 服务端示例代码
javascript 复制代码
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)。

javascript 复制代码
//打开客户端会话(用 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 多了元信息。可为数据添加额外的业务标注。发送大数据时,会自动分片(接收端自动聚合)

javascript 复制代码
//发送
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 的交互方式

javascript 复制代码
//发送并请求(有点像 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 多次接收。

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

视频演示效果:

代码仓库:

官网:

相关推荐
一个很帅的帅哥10 小时前
实现浏览器的下拉加载功能(类似知乎)
开发语言·javascript·mysql·mongodb·node.js·vue·express
Bang邦14 小时前
使用nvm管理Node.js多版本
前端·node.js·node多版本管理
新知图书14 小时前
Node.js快速入门
node.js
FakeOccupational15 小时前
nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink
前端·npm·node.js
亦舒.15 小时前
JSDelivr & NPM CDN 国内加速节点
前端·npm·node.js
代码搬运媛15 小时前
code eintegrity npm err sha512
前端·npm·node.js
猿来如此呀19 小时前
运行npm install 时,卡在sill idealTree buildDeps没有反应
前端·npm·node.js
八了个戒1 天前
Koa (下一代web框架) 【Node.js进阶】
前端·node.js
谢尔登1 天前
【Node.js】RabbitMQ 不同交换器类型的使用
node.js·rabbitmq·ruby
weixin_441018351 天前
webpack的热更新原理
前端·webpack·node.js