Socket.D v2.5.11

监听多个频道

</> markdown

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 的名字规则,给不同的前缀安排不同的处理。