Socket.D v2.5.12

使用 Broker 做广播服务(类似 stomp 体验)

</> markdown

广播服务是模拟 stomp 协议的体验模式,相对的区别是:Socket.D 以服务名做为接收目标。v2.5.0 后支持

broadcastBroker.broadcast("/hello", new StringEntity("world").at("*"))

四种 Broker 转发方式(或广播方式),可参考:《Broker 模式》

1、了解 BroadcastBroker 接口

/**
 * 广播经纪人
 */
public interface BroadcastBroker {
    /**
     * 广播
     *
     * @param event  事件
     * @param entity 实体(转发方式 https://socketd.noear.org/article/737 )
     */
    void broadcast(String event, Entity entity) throws IOException;
}

目前 BrokerListener 是 BroadcastBroker 接口的唯一实现(也可以自己定制)。

2、IOC框架应用示例(服务端)

@Configuration
public class DemoConfig {
    private Server server;
    private BrokerListener brokerListener = new BrokerListener();

    @Bean
    public BroadcastBroker start() throws IOException {
        server = SocketD.createServer("sd:ws") //使用 ws 作传输
                .listen(brokerListener)
                .config(c -> c.port(9008))
                .start();

        return brokerListener;
    }

    @Destroy
    public void destroy() {
        server.stop();
    }
}

@Controller
public class DemoController {
    @Inject
    BroadcastBroker broadcastBroker;
    
    @Mapping("/hello")
    public void hello(){
        //给叫 demoapp 中的其中一个客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("demoapp"))
        
        //给叫 demoapp 中的其中一个客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("demoapp*"))
        
        //给所有客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("*"))
    }
}

3、原生接口应用示例(服务端)

public class Demo {
    public static void main(String[] args) throws Exception {
        //是否复用,按需决定
        BrokerListener brokerListener = new BrokerListener();
        
        SocketD.createServer("sd:tcp") //使用 tcp 作传输
                .config(c -> c.port(8603).fragmentHandler(new BrokerFragmentHandler()))
                .listen(brokerListener)
                .start();
                
        ....
        
        //给叫 demoapp 中的其中一个客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("demoapp"))
        
        //给叫 demoapp 中的其中一个客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("demoapp*"))
        
        //给所有客户端发消息
        brokerListener.broadcast("/hello", new StringEntity("world").at("*"))
    }
}