本文主要是介绍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 适配)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!