像 WebSocket(或 Sse) 一样使用
socket.d 相对原生 ws:有事件(event)有元信息(meta),开发会方便很多
1、客户端示例代码
这个示例模拟聊天室的几个小场景。
<script>
async function demo(){
//构建事件监听
const eventListener = await SocketD.newEventListener().doOnMessage((s,m)=>{
//监听所有消息(可能不需要)
}).doOn("/im/user.upline", (s,m)=>{ //事件的应用
//监听用户上线
let user_id = m.meta("user_id");
}).doOn("/im/user.downline", (s,m)=>{
//监听用户下线
let user_id = m.meta("user_id"); //元信息的应用
});
//创建单例
window.clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
.listen(eventListener)
.open();
}
demo();
</script>
2、服务端示例代码
演示个简单的效果:有人加入时,通知所有客户端说有人上线了。
public class Demo {
public static void main(String[] args) throws Throwable {
List<Session> userSessions = new ArrayList<Session>();
//创建监听器
Listener listener = new EventListener().doOnOpen(s->{
//鉴权
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)->{
for(Session s1: userSessions){
//告诉所有用户,有人上线
s1.send("/im/user.upline", new StringEntity().metaPut("user_id"), s.attr("userId"));
}
});
//启动服务
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(listener)
.start();
}
}