监听多个频道
Sokcet.D 是基于 url 进行连接的。所谓频道,即指 url 中的 path。监听多个频道,即对不同的 path 安排不同的业务。
监听多个频道时,会用到框架包内置的 “PathListener”。比如:
- 我们有个用户频道("/")
- 还有,管理员频道("/admin/")
客户端连不同的地址,服务端则安排不同的处理(下面代码,用 java 演示):
public class Demo {
public static void main(String[] args) throws Throwable {
//::启动服务端
SocketD.createServer("sd:tcp")
.config(c -> c.port(8602))
.listen(new PathListener()
.doOf("/", new EventListener().doOnMessage((s, m) -> {
//用户频道
System.out.println("user::" + m);
}))
.doOf("/admin", new EventListener()
.doOnOpen(s -> {
//管理员频道
if ("admin".equals(s.param("u")) == false) {
s.close();
}
}).doOnMessage((s, m) -> {
System.out.println("admin::" + m);
})
)
)
.start();
}
}
再比如,我们在 IOC 容器里,有 mvc 频道("/mvc/"),和推送频道("/")。
- 推送频道
@ServerEndpoint("/")
public class WebSocketDemo extends SimpleListener {
@Override
public void onMessage(Session session, Message message) throws IOException {
session.send("我收到了:" + message);
}
}
- Mvc 频道
//协议转换处理
@ServerEndpoint("/mvc/")
public class SocketdAsMvc extends ToHandlerListener { }
//控制器
@Controller
public class HelloController {
@Socket //不加限定注解的话,可同时支持 http 请求
@Mapping("/mvc/hello")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}
其实还可以借助 event 的名字规则,给不同的前缀安排不同的处理。