监听与会话，是 Socket.D 的体验面门，是开发者与之交互的核心接口。


* Listener 监听器（可双向互听）

| 接口                                                  | 描述                 | 备注    |
|--------------------------------|-------------|------|
| listener::onOpen(session)                      | 当打开会话时     |   <mark>此时，服务端不能发消息；客户端可以发</mark>        |
| listener::onMessage(session, message)   | 当收到消息时     |           |
| listener::onClose(session)                      | 当关闭会话时     |           |
| listener::onError(session, error)              | 当出错时           |           |

服务端 onOpen 时，握手未完成，不能给“当前会话”发消息。具体参考：[《协议指令流详解》](/article/768)

* Session 会话关键接口（可双向互发） 

| 接口                                                                    | 描述       | 
|------------------------------------------|----------|
| session::send(event, entity)->SendStream             | 发送（Qos0）                 |
| session::sendAndRequest(event, entity)->RequestStream   | 发送并请求（且，只收一个答复。Qos1）<br/>//要求必须答复一次    |    
| session::sendAndRequest(event, entity, timeout)->RequestStream   | 带超时   |    
| session::sendAndSubscribe(event, entity)->SubscribeStream | 发送并订阅（且，接收多个答复）<br/>//在答复结束之前，不限答复次数。 | 
| session::sendAndSubscribe(event, entity, timeout)->SubscribeStream | 带超时 | 
| | | 
| session::reply(from, entity)            | 答复       |                 
| session::replyEnd(from, entity)         | 答复结束     |                   
| | | 
| session::colse()            | 关闭（“本端”不能再发消息，心跳中止）       |        

其中，需要对端答复的接口，有等待答复“超时”的概念（否则，没有超时概念）。

* Entity 三个内置实例

| 实体 | 说明 | 备注 |
| -------- | -------- | -------- |
| EntityDefault     | 默认实体     | 一般用于传二进制数据      |
| FileEntity          | 文件实体（基于 EntityDefault 扩展）     | 一般用于传输文件     |
| StringEntity      | 字符串实体（基于 EntityDefaul 扩展）     | 很常用（比如你发个 json 消息）     |

也可以基于 Entity 接口定制！
