Socket.D 像 WebSocket 或 Sse 一样使用
Socket.D 的 Js 开发,详见:《Socket.D - JavaScript 开发》 。socket.d 相对原生 websocket 多了两个元素:
- 事件(event)
- 元信息(meta)
- 有自动心跳与断线重连
会带来完全不同的体验,开发会便利很多!
1、客户端示例代码
这个示例模拟聊天室的几个小场景。以体验事件与元信息的强大!(开发时,要注意端口与服务端的对上)
<script src="/js/socket.d.js"></script>
<script>
async function demo(){
//构建事件监听
const eventListener = 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"); //元信息的应用
});
//创建单例
const clientSession = 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){
//告诉所有用户,有人上线
String userId = s.attr("userId");
s1.send("/im/user.upline", new StringEntity().metaPut("user_id", userId));
}
});
//启动服务
SocketD.createServer("sd:ws")
.config(c -> c.port(8602))
.listen(listener)
.start();
}
}
- Solon 代码风格
@ServerEndpoint("/")
public class SocketdEventListener extends EventListener {
List<Session> userSessions = new ArrayList<Session>();
public SocketdEventListener(){
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){
//告诉所有用户,有人上线
String userId = s.attr("userId");
s1.send("/im/user.upline", new StringEntity().metaPut("user_id", userId));
}
});
}
}