SocketD 是一个基于连接的、可扩展的、消息驱动的传输协议。具有异步,背压流控,双向通讯,多路复用,断线重连,支持签权,基于主题消息等特性。
* 具有语言无关性的二进制通信协议(支持 tcp, ws, udp)
* 异步非阻塞消息驱动通信
* 可以进行流量控制、自动连接恢复
* 支持双向通信(如:单链接双向 RPC 接口调用)
* 更加适合分布式通信场景
* 支持 ssl,支持国密 ssl
* 消息有由元信息和数据组成,通过元信息实现可扩展性
* 自动分片(数据超出 16Mb,会自动分片、自动重组)
* 接口简单
适用场景:
可用于 MSG、RPC、IM、MQ,等一些的场景开发,可替代 http, websocket, grpc 等一些协议。比如移动设备与服务器的连接,比如一些微服务场景等等。
协议格式:
* codec
[len:int][flag:int][sid:str(<64)][\n][topic:str(<512)][\n][metaString:str(<4k)][\n][data:bts(<16m)]
* flag
| Flag | Server | Client | 备注 |
|-----------|------------------------------|------------------------------|--------------|
| Unknown | ::close() | ::close() | |
| Connect | / | c(Connect)->s | |
| Connack | s(Connack),s::c.onOpen()->c | s(Connack)->c::onOpen() | |
| Ping | / | c(Ping)->s | |
| Pong | s(Pong)->c | / | |
| Close | s(Close)->c | c(Close)->s | 用于特殊场景(如:T人) |
| Message | s(Message)->c | c(Message)->s | |
| Request | s(Request)->c(Reply)->s | c(Request)->s(Reply)->c | |
| Subscribe | s(Subscribe)->c(Reply?..)->s | c(Subscribe)->s(Reply?..)->c | |
| Reply | s(Reply)->c | c(Reply)->s | |
| ReplyEnd | s(ReplyEnd)->c | c(ReplyEnd)->s | 结束答复 |