Solon v2.7.5

四、WebSocket 多频道监听 (v2)

</> markdown

WebSocket 是基于 url 连接的,频道即指 path(好像也叫 endpoint)。监听多频道,就是给不同的 path 安排不同的监听处理。比如:

  • 我们有个用户频道("/")
  • 还有,管理员频道("/admin/")

在 Solon 的集成环境里,我们可以使用 "ServerEndpoint" 注解方便实现多频道监听:

@ServerEndpoint("/")
public class WebSocketDemo extends SimpleWebSocketListener {
    @Override
    public void onMessage(Session session, Message message) throws IOException {
        socket.send("我收到了:" + text);
    }
}

@ServerEndpoint("/admin/")
public class WebSocketDemo extends SimpleWebSocketListener {
    @Override
    public void onMessage(Session session, Message message) throws IOException {
        socket.send("你是管理员哦:" + text);
    }
}

再比如,我们把("/sd/")频道,转成 socket.d 协议:

@ServerEndpoint("/sd/")
public class WebSocketDemo extends ToSocketdWebSocketListener {
    public WebSocketAsMvc() {
        super(new ConfigDefault(false), new EventListener()
                .doOnOpen(s -> {
                    //可以添加点签权?
                    if ("a".equals(s.param("u")) == false) {
                        s.close();
                    }
                })
                .doOn("/mvc/hello", (s, m) -> {
                    if (m.isRequest()) {
                        s.reply(m, new StringEntity("{\"code\":200}"));
                    }
                }));
    }
}

然后,我们把("/mvc/")频道,转成 mvc 接口:

@ServerEndpoint("/mvc/")
public class WebSocketAsMvc extends ToSocketdWebSocketListener {
    public WebSocketAsMvc() {
        //将 socket.d 普通监听器,换成 ToHandlerListener 
        super(new ConfigDefault(false), new ToHandlerListener()));
    }
}

//可以 Mvc 开发了
@Controller
public class HelloController {
    @Socket //不加限定注解的话,可同时支持 http 请求
    @Mapping("/demo/hello") 
    public Result hello(long id, String name) { //{code:200,...}
        return Result.succeed();
    }
}