Sokcet.D 是基于 url 进行连接的。所谓频道，即指 url 中的 path。监听多个频道，即对不同的 path 安排不同的业务。

监听多个频道时，会用到框架包内置的 “PathListener”。比如：

* 我们有个用户频道（"/"）
* 还有，管理员频道（"/admin/"）

客户端连不同的地址，服务端则安排不同的处理（下面代码，用 java 演示）：

```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/"），和推送频道（"/"）。

* 推送频道

```java
@ServerEndpoint("/")
public class WebSocketDemo extends SimpleListener {
    @Override
    public void onMessage(Session session, Message message) throws IOException {
        session.send("我收到了：" + message);
    }
}
```

* Mvc 频道

```java
//协议转换处理
@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 的名字规则，给不同的前缀安排不同的处理。