1.4 传输接口
优质
小牛编辑
131浏览
2023-12-01
传输接口
在客户端,传输层被设计为一个 Transport
接口,它只有两个方法:transport
和 abort
。该接口在不语言中虽然定义有所不同,但在形式和参数上大致是一致的。
例如在 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
属性用来描述该接口的实现支持那些传输协议,例如:http
,https
,tcp
,tcp4
,tcp6
,tls
,udp
,websocket
,unix
等。因为一个传输接口实现可能支持多种传输协议,因此该属性为一个字符串数组或字符串列表。
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
静态方法,因为默认提供的传输接口的实现都已经注册过了。除非用户实现自己的传输接口时,才需要用该方法来进行注册。