使用 Broker 做广播服务(类似 stomp 体验)
广播服务是模拟 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("*"))
}
}