目录
当前位置: 首页 > 文档资料 > Hprose 中文文档 >

1.4 传输接口

优质
小牛编辑
133浏览
2023-12-01

传输接口

在客户端,传输层被设计为一个 Transport 接口,它只有两个方法:transportabort。该接口在不语言中虽然定义有所不同,但在形式和参数上大致是一致的。

例如在 C# 中,该接口定义为:

public interface ITransport {
    Task<Stream> Transport(Stream request, Context context);
    Task Abort();
}

在 TypeScript 中,该接口定义为:

interface Transport {
    transport(request: Uint8Array, context: Context): Promise<Uint8Array>;
    abort(): Promise<void>;
}

interface TransportConstructor {
    readonly schemes: string[];
    new(): Transport
}

在 Dart 中,该接口定义为:

abstract class Transport {
  Future<Uint8List> transport(Uint8List request, Context context);
  Future<void> abort();
}

abstract class TransportCreator<T extends Transport> {
  List<String> schemes;
  T create();
}

该接口的实现还应有一个名为 schemes 的静态属性和一个无参构造函数。但大部分语言的接口没有办法对静态属性和构造函数做出约定,因此在接口定义中,体现不出这一点来。

schemes 属性用来描述该接口的实现支持那些传输协议,例如:httphttpstcptcp4tcp6tlsudpwebsocketunix 等。因为一个传输接口实现可能支持多种传输协议,因此该属性为一个字符串数组或字符串列表。

transport 方法用于实际传输的实现,request 是请求数据,返回值是响应数据。与请求相关的其它数据,比如服务地址,超时间隔等则在 context 参数中。

abort 方法用于中断与服务器的连接或请求。该方法在某些情况下不一定有实际实现的代码。

客户端有一个 register 静态方法,用来注册传输接口实现。

例如在 C# 中,该方法定义为:

public static void Register<T>(string name) where T : ITransport, new();

在 TypeScript 中,该方法被定义为:

public static register(name: string, ctor: TransportConstructor): void;

在 Dart 中,该方法被定义为:

static void register<T extends Transport>(String name, TransportCreator<T> creator);

虽然在不同语言中,形式和参数上有些差异,但是实现的功能是一样的。

但用户几乎不需要用到 register 静态方法,因为默认提供的传输接口的实现都已经注册过了。除非用户实现自己的传输接口时,才需要用该方法来进行注册。