引入 [solon-server-socketd](/article/1144) 及一个或多个传输协议包：


```xml
<!-- socket.d 的 solon 服务启动插件 -->
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-server-socketd</artifactId>
</dependency>

<!-- 使用哪个（或多个）传输包（按需选择）//这些传输包，会使用独立的端口 -->
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>socketd-transport-netty</artifactId>
    <version>${socketd.version}</version>
</dependency>
```

然后启用服务：

```java
public class DemoApp {
    public static void main(String[] args) {
        Solon.start(DemoApp.class, args, app->{
            //启用 Sokcet.D 服务（它是 solon-server-socketd 插件的启用控制）
            app.enableSocketD(true);
        });
    }
}
```

### 1、集成后的配置参考

更多配置参考：[应用常用配置说明](/article/174)

```yaml
#服务 socket 信号名称，服务注册时可以为信号指定名称（默认为 ${solon.app.name}）
server.socket.name: "waterapi.tcp"
#服务 socket 信号端口（默认为 20000+${server.port}）
server.socket.port: 28080
#服务 socket 信号主机（ip）
server.socket.host: "0.0.0.0"
#服务 socket 信号包装端口 //v1.12.1 后支持  //一般用docker + 服务注册时才可能用到
server.socket.wrapPort: 28080
#服务 socket 信号包装主机（ip）//v1.12.1 后支持
server.socket.wrapHost: "0.0.0.0"
#服务 socket 最小线程数（默认：0表示自动，支持固定值 2 或 倍数 x2）） //v1.10.13 后支持
server.socket.coreThreads: 0 
#服务 socket 最大线程数（默认：0表示自动，支持固定值 32 或 倍数 x32）） //v1.10.13 后支持
server.socket.maxThreads: 0
#服务 socket 闲置线程或连接超时（0表示自动，单位毫秒）） //v1.10.13 后支持
server.socket.idleTimeout: 0
#服务 socket 是否为IO密集型？ //v1.12.2 后支持
server.socket.ioBound: true
```


不同协议架构的独立端口，自动处理表：


| 协议架构   | 端口                                |  示例        | 
| -------- | -------------------- | -------- | 
| sd:tcp      | ${server.socket.port}          |  28080 | 
| sd:udp     | ${server.socket.port} + 1     |  28081 | 
| sd:ws      | ${server.socket.port} + 2     |  28082 | 



### 2、使用注解 `@ServerEndpoint` （此注解与 websocket 是共用的）

支持 `{name}` 获取路径变量。（不过，不建议使用路径变量）

```java
@ServerEndpoint("/demo/{id}")
public class SocketDDemo extends SimpleListener {
    @Override
    public void onMessage(Session session, Message message) throws IOException {
        session.send("test", new StringEntity("我收到了：" + message));
        //session.param("id"); //获取路径变量，querString变量，握手变量
    }
}
```
