我们在"前端接口"开发时,使用 socket.d 协议有什么好处:
- 功能上可以替代 http 和原生 ws
- 更安全!现有的工具想抓包数据,难!难!难!(socket.d 是个新的二进制协议)
1、Socket.D 协议特点
- 基于事件,每个消息都可事件路由
- 所谓语义,通过元信息进行语义描述
- 流关联性,有相关的消息会串成一个流
- 语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台
- 断线重连,自动连接恢复
- 多路复用,一个连接便可允许多个请求和响应消息同时运行
- 双向通讯,单链接双向互听互发
- 自动分片,数据超出 16Mb(大小可配置),会自动分片、自动重组(udp 除外)
- 接口简单,是响应式但用回调接口
2、客户端示例代码
使用时,可以根据自己的业务对原生接口包装,进一步简化使用。
html
<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、服务端示例代码
- 原生接口风格
java
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();
}
}
- Mvc 接口风格
具体参考 solon 的集成效果:https://solon.noear.org/article/652
java
//控制器
@Controller
public class HelloController {
@Socket
@Mapping("/hello/add")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}