**本案以简单的消息订阅模式为例演示：（即等着你给我来信，例如配置服务的变更通知）**


### 1、服务端

```java
//启动服务端
public class ServerApp {
    public static void main(String[] args) {
        //启动Solon容器（SocketD bean&plugin 由solon容器管理）
        Solon.start(ServerApp.class, args, app -> app.enableSocketD(true));
    }
}

//定义服务端监听，收集会话
@ServerEndpoint("/")
public class ServerListener extends SimpleListener {
    public static Map<String,Session> sessionMap = new ConcurrentHashMap<>();

    public static Collection<Session> getOpenSessions() {
        return sessionMap.values();
    }
    
    public static void broadcast(String text) throws IOException{
        for(Session s1 : getOpenSessions()){
            s1.send("/demo", new StringEntity(text));
        }
    }

    @Override
    public void onOpen(Session session) {
        sessionMap.put(session.sessionId(), session);
    }

    @Override
    public void onClose(Session session) {
        sessionMap.remove(session.sessionId());
    }
}

//在需要的地方，进行广播（例如：配置服务的更新通知）
ServerListener.broadcast("Hello client!");
```


### 2、客户端

```java
//启动客户端
public class ClientApp {
    public static void main(String[] args) throws Throwable {
        SocketD.createClient("sd:tcp://localhost:28080")
                .listen(new EventListener().doOnMessage((s, m)->{
                    System.out.println("客户端：我收到了：" + m);
                })).open();
    }
}
```

