iOS WebRTC 雜談之 RTCDataChannel

作為WebRTC的三大模塊之一,DataChannel支持短消息(short message)二進(jìn)制和文本數(shù)據(jù)的傳輸,因此伟阔,對(duì)于通常以傳輸音視頻為主的WebRTC來(lái)說(shuō)搭综,當(dāng)需要傳輸音視頻以外的數(shù)據(jù)的時(shí)候就有很大用處了。
這樣聽起來(lái)站辉,DataChannel看起來(lái)和Websocket實(shí)現(xiàn)的功能很相似呢撞。的確,DataChannel模型最初是基于webSocket建立的饰剥,具有簡(jiǎn)單可設(shè)置的send方法和onMessage方法殊霞。但是它們之間的區(qū)別是很明顯的:
1、RTCDataChannel通信是在peer與peer之間直接連接汰蓉,所以RTCDataChannel比WebSocket更快绷蹲,因?yàn)閃ebSocket需要服務(wù)器中轉(zhuǎn);但是相應(yīng)的顾孽,WebRTC依靠ICE Servers來(lái)穿透NAT祝钢,有的場(chǎng)景下可能會(huì)多一層TURN服務(wù)器的轉(zhuǎn)發(fā)。
2若厚、WebSocket協(xié)議是基于TCP傳輸?shù)睦褂ⅲ軌虮WC數(shù)據(jù)的安全有序地到達(dá);而RTCDataChannel是基于SCTP傳輸協(xié)議(SCTP是一種TCP盹沈、UDP同級(jí)的傳輸協(xié)議)龄章, 默認(rèn)情況下是可靠有序傳輸吃谣。但是它也可以配置是否進(jìn)行可靠的傳輸,這就意味著有可能會(huì)通過(guò)丟失數(shù)據(jù)來(lái)達(dá)到性能的要求做裙,這使得RTCDataChannel更為靈活岗憋。這里說(shuō)一下,為什么會(huì)有配置不可靠傳輸?shù)男枨竽孛恳驗(yàn)閷?shí)時(shí)通信對(duì)時(shí)間是非常敏感的仔戈,以音視頻為例,它可以容忍間接性的數(shù)據(jù)包丟失拧廊,可以通過(guò)算法來(lái)填補(bǔ)這個(gè)丟失的數(shù)據(jù)监徘,因此WebRTC對(duì)及時(shí)性和低延時(shí)的要求要比數(shù)據(jù)傳輸?shù)目煽啃砸蟾摺?br> 3、WebSocket構(gòu)造需要一個(gè)url吧碾,與服務(wù)器建立連接凰盔,創(chuàng)建一個(gè)唯一的SocketSessionId;DataChannel 的連接依賴于一個(gè)RTCPeerConnection對(duì)象倦春,當(dāng)RTCPeerConnection建立起來(lái)后户敬,可以包含一個(gè)或多個(gè)RTCDataChannel。
還有其他的一些區(qū)別睁本,例如大文件傳輸時(shí)的擁塞控制尿庐、加密等,不在列舉呢堰。

在IOS WebRTC中抄瑟,要使用RTCDataChannel非常簡(jiǎn)單

#import <WebRTC/RTCDataChannel.h>
#import <WebRTC/RTCDataChannelConfiguration.h>

- (void)createDataChannelWithPeerConnection:(RTCPeerConnection*)peerConnection connectionId:(NSString*)connectionId{
    //給p2p連接創(chuàng)建dataChannel
    RTCDataChannelConfiguration *dataChannelConfiguration = [[RTCDataChannelConfiguration alloc] init];
    dataChannelConfiguration.isNegotiated = NO;
    RTCDataChannel* localDataChannel = [peerConnection dataChannelForLabel:@"localDataChannel" configuration:dataChannelConfiguration];
    localDataChannel.delegate = self;
    [self.localDataChannelDictionary setObject:localDataChannel forKey:connectionId];//本地記錄一下
}

有一點(diǎn)很重要,就是DataChannel的創(chuàng)建是在生成本地offer之前枉疼,這樣才能在生成offer后皮假,使offer中包含DataChannel的信息。
關(guān)于DataChannel的配置參數(shù)往衷,你可以查看<WebRTC/RTCDataChannelConfiguration.h>中的各種參數(shù)及說(shuō)明钞翔。
當(dāng)創(chuàng)建好RTCDataChannel后,下面的回調(diào)會(huì)被執(zhí)行:

/** New data channel has been opened. */
- (void)peerConnection:(RTCPeerConnection*)peerConnection didOpenDataChannel:(RTCDataChannel*)dataChannel{
    NSLog(@"%s",__func__);
    dataChannel.delegate = self;
}

不要忽略設(shè)置delegate = self哦席舍,否則你是無(wú)法收發(fā)消息的布轿。
發(fā)送消息:

-(void)sendMessage:(NSString *)message{
    
    NSDictionary* messageDic = @{@"type":@"text",@"value":message};
    NSData* messageData = [NSJSONSerialization dataWithJSONObject:messageDic options:NSJSONWritingPrettyPrinted error:nil];
    
    RTCDataBuffer *buffer = [[RTCDataBuffer alloc] initWithData:messageData isBinary:NO];

    [self.localDataChannelDictionary enumerateKeysAndObjectsUsingBlock:^(NSString* connectionId, RTCDataChannel* dataChannel, BOOL * _Nonnull stop) {
        bool success = [dataChannel sendData:buffer];
        if (success){
            NSLog(@"sendmessageSuccess = %@",message);
        }else{
            NSLog(@"SendMessageFailed");
        }
    }];
}

這里需要說(shuō)一下,如果使用RTCDataChannel發(fā)送圖片来颤,需要將type設(shè)置為image汰扭,并且進(jìn)行base64編碼。

當(dāng)收到消息時(shí)福铅,下面的回調(diào)會(huì)被執(zhí)行:

/** The data channel successfully received a data buffer. */
- (void)dataChannel:(RTCDataChannel *)dataChannel didReceiveMessageWithBuffer:(RTCDataBuffer *)buffer{
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝毛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滑黔,更是在濱河造成了極大的恐慌笆包,老刑警劉巖环揽,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庵佣,居然都是意外死亡歉胶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門巴粪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)通今,“玉大人,你說(shuō)我怎么就攤上這事肛根”杷” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵派哲,是天一觀的道長(zhǎng)臼氨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狮辽,這世上最難降的妖魔是什么一也? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮喉脖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抑月。我一直安慰自己树叽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布谦絮。 她就那樣靜靜地躺著题诵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层皱。 梳的紋絲不亂的頭發(fā)上性锭,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音叫胖,去河邊找鬼草冈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓮增,可吹牛的內(nèi)容都是我干的怎棱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼绷跑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳恋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起砸捏,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谬运,失蹤者是張志新(化名)和其女友劉穎隙赁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梆暖,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸳谜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了式廷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐扭。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滑废,靈堂內(nèi)的尸體忽然破棺而出蝗肪,到底是詐尸還是另有隱情,我是刑警寧澤蠕趁,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布薛闪,位于F島的核電站,受9級(jí)特大地震影響俺陋,放射性物質(zhì)發(fā)生泄漏豁延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一腊状、第九天 我趴在偏房一處隱蔽的房頂上張望诱咏。 院中可真熱鬧,春花似錦缴挖、人聲如沸袋狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苟鸯。三九已至,卻和暖如春棚点,著一層夾襖步出監(jiān)牢的瞬間早处,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工瘫析, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌梆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓颁股,卻偏偏與公主長(zhǎng)得像么库,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甘有,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容