iOS实现:
1、有序的dataChannel
有序的dataChannel会有包依赖,上一个包未发送成功,下一个包会等待知道上一个包成功
2、无序的dataChannel
无序的dataChannel没有包依赖,所有的包都是无序发送,不需要等待上一个包的状态
以上两种方式都有经过抓包、打印LOG验证过。
在iOS上dataChannel的初始化是全局的,一旦定义了order类型,就会导致所有的消息投递都是该类型,但平时开发中不同的业务消息可能需要的类型不一样,例如我们当前有个业务就是做心跳包保活就需要用到无序,心跳需要实时性,用有序的容易出现上一个心跳还没投递出去,下一个心跳一直等待导致容易心跳超时。故此需要拓展接口,每个消息投递都可以自定义投递类型,更改如下所示:
总体走向如下:RTCDataChannel->SctpDataChannel->SctpDataChannelTransport:;CreateSctpSendParams->UsrsctpTransport::SendMessageInternal::usrsctp_sendv
RTCDataChannel添加拓展方法:- (BOOL)sendData:(RTCDataBuffer*)dataisOrdered:(BOOL)isOrdered
在基类(DataChannelInterface)添加实现方法:
virtual bool CustomSend(constDataBuffer& buffer,boolisOrdered) {
printf("CustomSend Not Excute");
return0;
}
在sctp_data_channel添加PROXY_METHOD2(bool, CustomSend,constDataBuffer&,bool)不然会调用不到
在sctp_data_channel重写CustomSend来实现消息投递,如下所示:
至此整个流程完成,也就实现的不同的消息类型可以支持不同的order
Android:后续抽时间整理