Solon v2.7.5

Socket.D 像 WebSocket 或 Sse 一样使用

</> markdown

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));
            }
        });
    }
}