我们在"前端接口"开发时,使用 socket.d 协议有什么好处:
-
功能上可以替代 http 和原生 ws
-
安全!安全!安全!现有的工具想抓包数据,难!难!难!(socket.d 是个新的二进制协议)
1、Socket.D 协议特点
-
基于事件,每个消息都可事件路由
-
所谓语义,通过元信息进行语义描述
-
流关联性,有相关的消息会串成一个流
-
语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台
-
断线重连,自动连接恢复
-
多路复用,一个连接便可允许多个请求和响应消息同时运行
-
双向通讯,单链接双向互听互发
-
自动分片,数据超出 16Mb(大小可配置),会自动分片、自动重组(udp 除外)
-
接口简单,是响应式但用回调接口
2、客户端示例代码
使用时,可以根据自己的业务对原生接口包装,进一步简化使用。
<script src="js/socket.d.js"></script>
<script>
//创建单例
const clientSession = SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
.open();
//添加用户(加个内容类型,方便与 Mvc 对接)
const entity = SocketD.newEntity("{id:1,name:'noear'}").metaPut("Content-Type","text/json"),
clientSession.sendAndRequest("/user/add", entity, reply=>{
const rst = JSON.parse(reply.dataAsString());
if(rst.code == 200){
alert("添加成功!");
}else{
alert("添加失败");
}
})
</script>
Socket.D 有三个发消息的接口:
接口
|
说明
|
send
|
像 websocket。多了事件与元信息
|
sendAndRequest
|
像 http
|
sendAndSubscribe
|
像 reactive stream 。多了事件与元信息
|
3、服务端示例代码
public class Demo {
public static void main(String[] args) throws Throwable {
//创建监听器
Listener listener = new EventListener().doOnOpen(s->{
//鉴权
if("a".equals(s.param("u")) == false){
s.close();
}
}).doOn("/user/add", (s,m)->{
if(m.isRequest()){
s.reply(m, new StringEntity("{\"code\":200}"));
}
});
//启动服务
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(listener)
.start();
}
}
具体参考 solon 的集成效果:
https://solon.noear.org/article/652
//控制器
@Controller
public class HelloController {
@Socket
@Mapping("/hello/add")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}
4、开源仓库
-
github:
https://github.com/noear/socket.d
-
gitee:
https://gitee.com/noear/socket.d