介于协议特点的“双向通讯”能力，Socket.D 的客户端与服务端同时具备“请求”与“响应”的能力。在这个能力的支持下，业务概念的客户端与服务端，都以 Client 的身份（可称为 Player），连入一个中心 Server（可称为 Broker）。Player 发送消息后，由 Broker 进行转发给另一个（或一批） Player。此为，Socket.D Broker 模式，也是一个天然的集群形态。

感观上像是，一批玩家（Player）连接加入到了一个（或多个）社交平台（Broker）。就像我们用微信（或QQ）那样，大家连入微信服务器，发消息时由微信服务器转发给另一个（或一批）用户。

### 架构特点

#### 1、中心与环绕结构

所有 Player 端，连到一个或多个 Broker 中心（一般用两个或以上，构建高可用性）。Player 既发送消息，也可答复消息。

#### 2、自带注册与发现中心

连入的 Player 都会有自己的名字（连接时用`@`参数为自己取名）。且 Broker 实时感应它们的连接状态（毫秒级）。相对传统第三方注册服务架构，反应极快。连接地址示例：

```yaml
sd:tcp://127.0.0.1:8602?@=demoapp
```

定制时，还可以通过别的方式为服务取多个不同的名字。比如，消息中间件开发在订阅行为时给自己取**多个名字**。

#### 3、无端口启动

Player 无端口启动。以技术客户端的身份，连入 Broker。相对传统架构，不需要暴露业务服务的端口，更安全。

#### 4、四种 Broker 转发方式（或广播方式）

* 四种转发方式（单播，单播!，组播，广播）：


| at                 | 描述       |         备注 |
| ----------- | ------ | -------- |
| `demoapp`      | 单播     | 给叫这个名的其中一个会话发（使用 轮询 “负载均衡”策略）     |
| `demoapp!`     | 单播!     | 给叫这个名的其中一个会话发（使用 ip_hash “负载均衡”策略     |
| `demoapp*`     | 组播     | 给叫这个名的整组会话发（如果自己也叫这个名，则自己除外）     |
| `*`                  | 广播     | 给集群里的全部会话发（自己除外）     |

* 通过at方式进行转发，示例：

```java
session.send("test", new StringEntity("hello").at("demoapp"));
session.send("test", new StringEntity("hello").at("demoapp!"));
session.send("test", new StringEntity("hello").at("demoapp*"));
session.send("test", new StringEntity("hello").at("*"));
```


