用 Socket.D 替代原生 WebSocket 做前端开发
socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据,但功能更强大。
| 功能 | 原生 websocket | socket.d | 说明 |
|---|---|---|---|
| listen | 有 | 有 | 监听消息 |
| send | 有 | 有 | 发消息 |
| sendAndRequest | 无 | 有 | 发消息并接收一个响应(类似于 http) |
| sendAndSubscribe | 无 | 有 | 发消息并接收多个响应(也叫订阅) |
| event(or path) | 无 | 有 | 消息有事件或路径(可对消息,进行业务路由) |
| meta(or header) | 无 | 有 | 消息有元信息或头信息(可为数据,标注业务语义) |
| 自动心跳 | 无 | 有 | |
| 断开后自动重链 | 无 | 有 |
下面感受下开发方面的差异!
1、客户端示例代码
使用时,可以根据自己的业务对原生接口包装,进一步简化使用。
<script src="js/socket.d.js"></script>
<script>
async function init(){
//构建事件监听
const eventListener = await SocketD.newEventListener().doOnMessage((s,m)=>{
//监听所有消息(可能不需要)
}).doOn("/im/user.upline", (s,m)=>{ //事件的应用
//监听用户上线
let user_id = m.meta("user_id");
}).doOn("/im/user.downline", (s,m)=>{
//监听用户下线
let user_id = m.meta("user_id"); //元信息的应用
});
//创建单例
window.clientSession = SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
.listen(eventListener)
.open();
}
function join(){
clientSession.sendAndRequest("/user/join", SocketD.newEntity()).thenReply(r->{
//加入成功
});
}
init();
</script>
Socket.D 有三个发消息的接口:
| 接口 | 说明 |
|---|---|
| send | 像 websocket。多了事件与元信息属性 |
| sendAndRequest | 像 http |
| sendAndSubscribe | 像 reactive stream 。多了事件与元信息属性 |
2、服务端示例代码(用 java 演示)
public class Demo {
public static void main(String[] args) throws Throwable {
List<Session> userSessions = new ArrayList<Session>();
//创建监听器
Listener listener = new EventListener().doOnOpen(s->{
//鉴权
if("a".equals(s.param("u")) == false){
s.close();
}else{
//加入用户表
s.attrPut("user_id", s.param("u"));
userSessions.add(s);
}
}).doOn("/user/join", (s,m)->{
if(m.isRequest()){
s.reply(m, new StringEntity());
}
for(Session s1: userSessions){
//告诉所有用户,有人上线
s1.send("/im/user.upline", new StringEntity().metaPut("user_id"), s.attr("userId"));
}
});
//启动服务
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(listener)
.start();
}
}
3、Socket.D 是什么东东?
Socket.D 是一个基于“事件”和“语义消息”“流”的网络应用层协议(听起来好像很 ao 口)。支持 tcp, udp, ws, kcp 传输(有各种不同语言的实现)。有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。
协议之所有强大,有三个关键基础因素:
- 事件
- 语义消息
- 流
它的帧码结构:
[len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)]
因为是应用层协议,所以可以建立在任意传输层协议之上。比如 websocket。
4、开源仓库
用 Socket.D 替代原生 WebSocket 做前端开发的更多相关文章
- 从cocos2d-html5中提取出来的,用做前端开发的框架——cc.js
从cocos2d-html5中提取出来的,用做前端开发的框架——cc.js /************************************************************* ...
- 利用 Grunt (几乎)无痛地做前端开发 (一)之单元测试
前言 如果你想开发一个js应用,甭管多简单,都要先创建整个宇宙 来看看我们的Javascript小宇宙: 确定如何根据需求.功能划分模块,如何将代码分成多个文件开发,合成一个发布 保证上一条的同时,使 ...
- 做一个会使用PS的前端开发
做前端开发的需不需要PS 记得在之前的老东家做某一个系统开发,当时正在做界面开发,发现界面还需要添加几个图标,于是把这个需求反馈给了项目经理.过了十几分钟,项目经理跑过来告诉我:产品部的UI设计人员( ...
- 在做APP前端开发时应注意的一些问题
在做APP前端开发时应注意的一些问题 在整个app开发流程中,app前端开发是一个必不可少的环节,也是一个在app开发过程中重量级的角色.说到这,那么在app应用的前端开发中,又要注意什么问题呢?一. ...
- web前端开发与iOS终端开发的异同[转]
* {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-fami ...
- 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars 一.为什么需要使用模板引擎? 关于为什么要使用模板引擎,按照我常对学生说的一句话就是:不用重复造轮子.. 简单来说,模板最 ...
- web前端开发必备技术
1.Vue.js是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注 ...
- Visual Studio前端开发工具/扩展
怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做前端开发.Visual Studio 2010不管是旗舰版还是免费版 ...
- openresty 前端开发进阶一之http后端
做前端开发,大多数情况下,都需要跟后端打交道,而最常见的方式则是通过http请求,进行通信. 在openresty中,通过http跟后端整合通信的方式又很多种,各有各的好处,可以根据情况交叉使用 1. ...
- 用 Docker 快速配置前端开发环境
来源于:http://dockone.io/article/1714 今天是你入职第一天. 你起了个大早,洗漱干净带着材料去入职. 签了合同,领了机器,坐到工位,泡一杯袋装红茶,按下开机键,输入密码, ...
随机推荐
- Eolink Apikit 如何进行自动化测试?
自动化测试是一种软件测试方法,利用自动化工具和脚本来执行测试用例,以验证软件应用程序的功能.性能.稳定性等特性.自动化测试的主要目的是提高测试效率.减少测试成本,并确保软件的质量和可靠性. 作为测试人 ...
- 文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题
三.用go语言,给定一个n结点的二叉树,写出一个 O(n)时间的非递归过程,将该树每个结点的关键字输出.可以使用一个栈作为辅助数据结构. 文心一言: 以下是一个使用 Go 语言编写的函数,该函数使用一 ...
- 线性dp数字三角形
数字三角形是最裸的题目,没有加入任何的背景,这里就不写了. 下面这道摘花生的题目就是数字三角形的应用 Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图) ...
- c#中工厂模式详解
总体介绍: 工厂模式主要有三种类型:简单工厂.工厂方法和抽象工厂,该模式用于封装和管理对象的创建,是一种创建型模式. 万物皆对象,创建对象时必然需要new该对象,当需要更改对象时,需要把项目中 ...
- Vue一些进阶知识-基于官网(笔记)
前言 主要根据vue官网文档完成.对一些平时可能会用到的知识.组件进行收集,为的是对vue的可用性有一个大致的了解.博客中的组件介绍可能只涉及简单用法,完整用法还是以官网为准. 基础 启动过程: 主文 ...
- srm-50
刚开始拿到题目没有思路,看了字符串发现也没什么特别的,也没有提示输入什么什么,然后找到main函数,f5进去以后也没什么特别的 然后就看了wp发现得从程序本身出发去解决问题 点开程序,随便输入点什么 ...
- String 的 indexOf 与 search 方便的区别
String 这个对象里面包含许多方法 今天只要讲 indexOf 与 search 1.indexOf stringObject.indexOf(searchvalue,fromindex) 2.s ...
- js朗读实现
js 利用window实现朗读功能 ` 发音
- Hadoop学习(一) 搭建伪分布式集群
文章结构 1.准备工作 1.1 配置IP 1.2 关闭防火墙 1.3 修改主机名并与IP绑定 1.4 创建新用户 1.5 配置免密匙 2.安装并配置Hadoop伪分布式集群 2.1 安装Java 2. ...
- HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别
HTTP 和 HTTPS 是两种常见的网络协议,它们都是用于在浏览器和服务器之间传输数据的.但是,它们之间也有一些重要的区别,这些区别涉及到数据的安全性.传输性能.使用成本和搜索排名等方面.本文将从以 ...