应用 - 流控 + 告警传递
告警协议(Session::sendAlarm),传递到对端时会变为异常
1、客户端
//::打开客户端会话
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
.open();
//发送并请求
clientSession.sendAndSubscribe("/demo", SocketD.newEntity().range(5,5)
.metaPut("videoId", "42E056E1-B4B7-4EF4-AC4B-AEE77EDB0B86")).thenReply(r -> {
if (r.dataSize() > 0) {
console.info(r);
}
}).thenError(err => {
console.info(err);
});
2、服务端(以 java 为例)
public class Demo {
public static void main(String[] args) throws Throwable {
//::启动服务端
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(new EventListener().doOn("/demo", (s, m) -> {
if (m.isSubscribe() == false) {
s.sendAlarm(m, "此事件只支持订阅模式");
return;
}
long videoId = m.metaAsLong("videoId");
int rangeStart = m.rangeStart();
int rangeSize = m.rangeSize();
if (videoId == 0 || rangeSize == 0) {
s.sendAlarm(m, "参数不合规");
return;
}
ByteBuffer[] fragments = new ByteBuffer[rangeSize];
for (int i = 0; i < rangeSize; i++) {
s.reply(m, new EntityDefault().dataSet(fragments[i]));
}
s.replyEnd(m, new EntityDefault());
}))
.start();
}
}