苏州网站推广公司,网站建设的栏目策划,我爱我家租房房源信息网,vpn免流网站建设Socket.D
是基于事件和语义消息流的网络应用层传输协议。有用户说#xff0c;“Socket.D 之于 Socket#xff0c;尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。协议特点可参考《官网介绍》。
pyton 已开发完成事件和语义消息流的网络应用层传输协议。有用户说“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/?token1b0VsGusEkddgr3d).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/socketdhttps://github.com/noear/socketd
官网
https://socketd.noear.org