Skip to content

连接器 (Connector)

Connector 是 RPC 通信的传输层抽象,负责底层协议的连接建立与数据收发。框架提供三种内置实现:

Connector协议连接模式
TCPConnector@sora-soft/frameworkTCP长连接
HTTPConnector@sora-soft/http-supportHTTP每请求独立
WebSocketConnector@sora-soft/http-supportWebSocket长连接

提示: 大多数场景下开发者不需要直接操作 Connector。通过 Provider 发起 RPC 调用时,框架会自动管理 Connector 的创建、连接和销毁。

注册 Connector

在使用 Provider 之前,需要先注册要用到的 Connector。注册是将 Connector 工厂绑定到协议标识,Provider 在连接远程 Listener 时会根据协议自动选择对应的 Connector:

typescript
import { TCPConnector } from '@sora-soft/framework';
import { HTTPConnector, WebSocketConnector } from '@sora-soft/http-support';

class Pvd {
  static registerSenders() {
    TCPConnector.register();
    HTTPConnector.register();
    WebSocketConnector.register();
  }

  static business = new Provider<BusinessHandler>(ServiceName.Business);
}

只需注册应用需要用到的协议,不需要的可以不注册。

在 Application 启动时调用注册:

typescript
class MyApplication extends Application {
  async startup() {
    Pvd.registerSenders();
  }
}

手动使用

Connector 可以脱离 Provider 直接使用,适合测试或点对点通信场景:

typescript
import { TCPConnector, Request, JsonBufferCodec } from '@sora-soft/framework';

const connector = new TCPConnector();
await connector.start(listener.metaData, new JsonBufferCodec());

connector.dataSubject.subscribe((data) => {
  console.log('received:', data);
});

const request = new Request({
  method: 'echo',
  service: 'test',
  headers: {},
  payload: { message: 'hello' },
});
await connector.send(request.toPacket());

await connector.off();

提示: 上例直接操作 Connector 以演示底层通信。实际开发中推荐通过 Provider 发起调用。

Session

每个 Connector 拥有一个 session 属性,作为该连接的唯一标识。在服务端由 Listener 创建 Connector 时自动分配(UUID),调用端由框架内部管理:

typescript
connector.session;  // 'a1b2c3d4-...'

通过 session 可以在 Listener 的连接池中查找对应的 Connector:

typescript
const connector = listener.getConnector(session);

生命周期

Connector 的状态变化可以通过 stateSubject(RxJS Observable)监听:

typescript
connector.stateSubject.subscribe((state) => {
  switch (state) {
    case ConnectorState.Ready:
      console.log('连接就绪:', connector.session);
      break;
    case ConnectorState.Stopping:
      console.log('正在断开:', connector.session);
      break;
    case ConnectorState.Stopped:
      console.log('已断开:', connector.session);
      break;
    case ConnectorState.Error:
      console.log('连接异常:', connector.session);
      break;
  }
});
状态说明
Init初始状态
Connecting正在建立连接
Pending连接已建立,等待 Codec 协商
Ready就绪,可以收发数据
Stopping正在断开
Stopped已断开
Error连接异常

下一步

基于 WTFPL 许可发布