Socket.D v2.5.11

然后加入 Broker 集群,参与会话

</> markdown

1、加入 Broker 集群(就像进入社交群)

需要使用 url 的 @ 参数,给自己取个名字。当然,不加入集群也可以通过 @ 参数给自己取名。不取名行不行?免强也行,做为游客。只能主动给有名字的玩家发消息,别人没办法给你发。

public class Demo {
    public static void main(String[] args) throws Exception {
        SocketD.createClient("sd:tcp://127.0.0.1:8602?@=demoapp")
                .listen(new EventListener().doOn("hello", (s, m) -> {
                    System.out.println(m);
                }))
                .open();
    }
}

//Broker 服务端,可以通过 session.name() 获取玩家的 `@` 参数

如果有多个 Broker 服务?可以使用集群客户端:

public class Demo {
    public static void main(String[] args) throws Exception {
        //
        //也可以不使用集群客户端,自己创建多个会话并管理即可
        //
        SocketD.createClusterClient("sd:tcp://127.0.0.1:8602?@=demoapp", 
                                    "sd:tcp://127.0.0.1:8603?@=demoapp", 
                                    "sd:tcp://127.0.0.1:8604?@=demoapp")
                .listen(new EventListener().doOn("hello", (s, m) -> {
                    System.out.println(m);
                }))
                .open();
    }
}

2、给另一个玩家发消息

  • 使用实体的 at 函数,指定消息接收人(其它用法都没变)。没错,就是在模拟这种社交的感觉:
public class Demo {
    public static void main(String[] args) throws Exception {
        
        ClientSession session = SocketD.createClusterClient("sd:tcp://127.0.0.1:8602?@=demoapp")
                .listen(new EventListener().doOn("hello", (s, m) -> {
                    System.out.println(m);
                }))
                .open();
        
        //使用实体的 at ,指定消息接收人
        session.send("test", new StringEntity("hello").at("userapp"))
    }
}
  • 三种 at 模式(单播,组播,广播):
at描述备注
demoapp单播给叫这个名的其中一个会话发(使用平均询论负载均衡策略)
demoapp*组播给叫这个名的所有会话发(如果自己也叫这个名,则自己除外)
*广播给集群里的全部会话发(自己除外)
  • 示例:
session.send("test", new StringEntity("hello").at("userapp"));
session.send("test", new StringEntity("hello").at("userapp*"));
session.send("test", new StringEntity("hello").at("*"));