用 Socket.D 替代原生 WebSocket 做前端开发
生活随笔
收集整理的這篇文章主要介紹了
用 Socket.D 替代原生 WebSocket 做前端开发
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
socket.d.js 是基于 websocket 包裝的 socket.d 協(xié)議的實(shí)現(xiàn)。就是用 ws 傳輸數(shù)據(jù),但功能更強(qiáng)大。
| 功能 | 原生 websocket | socket.d | 說(shuō)明 |
|---|---|---|---|
| listen | 有 | 有 | 監(jiān)聽(tīng)消息 |
| send | 有 | 有 | 發(fā)消息 |
| sendAndRequest | 無(wú) | 有 | 發(fā)消息并接收一個(gè)響應(yīng)(類似于 http) |
| sendAndSubscribe | 無(wú) | 有 | 發(fā)消息并接收多個(gè)響應(yīng)(也叫訂閱) |
| event(or path) | 無(wú) | 有 | 消息有事件或路徑(可對(duì)消息,進(jìn)行業(yè)務(wù)路由) |
| meta(or header) | 無(wú) | 有 | 消息有元信息或頭信息(可為數(shù)據(jù),標(biāo)注業(yè)務(wù)語(yǔ)義) |
| 自動(dòng)心跳 | 無(wú) | 有 | |
| 斷開(kāi)后自動(dòng)重鏈 | 無(wú) | 有 |
下面感受下開(kāi)發(fā)方面的差異!
1、客戶端示例代碼
使用時(shí),可以根據(jù)自己的業(yè)務(wù)對(duì)原生接口包裝,進(jìn)一步簡(jiǎn)化使用。
<script src="js/socket.d.js"></script>
<script>
async function init(){
//構(gòu)建事件監(jiān)聽(tīng)
const eventListener = await SocketD.newEventListener().doOnMessage((s,m)=>{
//監(jiān)聽(tīng)所有消息(可能不需要)
}).doOn("/im/user.upline", (s,m)=>{ //事件的應(yīng)用
//監(jiān)聽(tīng)用戶上線
let user_id = m.meta("user_id");
}).doOn("/im/user.downline", (s,m)=>{
//監(jiān)聽(tīng)用戶下線
let user_id = m.meta("user_id"); //元信息的應(yīng)用
});
//創(chuàng)建單例
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 有三個(gè)發(fā)消息的接口:
| 接口 | 說(shuō)明 |
|---|---|
| send | 像 websocket。多了事件與元信息屬性 |
| sendAndRequest | 像 http |
| sendAndSubscribe | 像 reactive stream 。多了事件與元信息屬性 |
2、服務(wù)端示例代碼(用 java 演示)
public class Demo {
public static void main(String[] args) throws Throwable {
List<Session> userSessions = new ArrayList<Session>();
//創(chuàng)建監(jiān)聽(tīng)器
Listener listener = new EventListener().doOnOpen(s->{
//鑒權(quán)
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"));
}
});
//啟動(dòng)服務(wù)
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(listener)
.start();
}
}
3、Socket.D 是什么東東?
Socket.D 是一個(gè)基于“事件”和“語(yǔ)義消息”“流”的網(wǎng)絡(luò)應(yīng)用層協(xié)議(聽(tīng)起來(lái)好像很 ao 口)。支持 tcp, udp, ws, kcp 傳輸(有各種不同語(yǔ)言的實(shí)現(xiàn))。有用戶說(shuō),“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。
協(xié)議之所有強(qiáng)大,有三個(gè)關(guān)鍵基礎(chǔ)因素:
- 事件
- 語(yǔ)義消息
- 流
它的幀碼結(jié)構(gòu):
[len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)]
因?yàn)槭菓?yīng)用層協(xié)議,所以可以建立在任意傳輸層協(xié)議之上。比如 websocket。
4、開(kāi)源倉(cāng)庫(kù)
- github: https://github.com/noear/socket.d
- gitee: https://gitee.com/noear/socket.d
總結(jié)
以上是生活随笔為你收集整理的用 Socket.D 替代原生 WebSocket 做前端开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【scikit-learn基础】--『监
- 下一篇: 实践总结 3 种前端部署后页面检测版本的