四、WebSocket 多频道监听 (v2)
WebSocket 是基于 url 连接的,频道即指 path(好像也叫 endpoint)。监听多频道,就是给不同的 path 安排不同的监听处理。比如:
- 我们有个用户频道("/")
- 还有,管理员频道("/admin/")
在 Solon 的集成环境里,我们可以使用 "ServerEndpoint" 注解方便实现多频道监听:
@ServerEndpoint("/")
public class WebSocketDemo extends SimpleWebSocketListener {
@Override
public void onMessage(WebSocket socket, String text) throws IOException {
socket.send("我收到了:" + text);
}
}
@ServerEndpoint("/admin/")
public class WebSocketDemo extends SimpleWebSocketListener {
@Override
public void onMessage(WebSocket socket, String text) 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();
}
}