色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發(fā)燒友網! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網>源碼下載>通訊/手機編程>

iOS系統(tǒng)SRWebSocket的源碼解析下

大小:0.3 MB 人氣:0 2017-09-25 需要積分:1

  四。 接著來講講數據的讀和寫:

  當建立連接成功后,就會循環(huán)調用這么一個方法:

  //讀取http頭部

  - (void)_readHTTPHeader;

  {

  if (_receivedHTTPHeaders == NULL) {

  //序列化的http消息

  _receivedHTTPHeaders = CFHTTPMessageCreateEmpty(NULL, NO);

  }

  //不停的add consumer去讀數據

  [self _readUntilHeaderCompleteWithCallback:^(SRWebSocket *self, NSData *data) {

  //拼接數據,拼到頭部

  CFHTTPMessageAppendBytes(_receivedHTTPHeaders, (const UInt8 *)data.bytes, data.length);

  //判斷是否接受完

  if (CFHTTPMessageIsHeaderComplete(_receivedHTTPHeaders)) {

  SRFastLog(@“Finished reading headers %@”, CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_receivedHTTPHeaders)));

  [self _HTTPHeadersDidFinish];

  } else {

  //沒讀完遞歸調

  [self _readHTTPHeader];

  }

  }];

  }

  記得樓主之前寫過一篇即時通訊下數據粘包、斷包處理實例(基于CocoaAsyncSocket),因此拋出一個問題,WebSocket需要處理數據的斷包和粘包么?

  答案是基本不需要。引用知乎上的一段回答:

  RFC規(guī)范指出,WebSocket是一個message-based的協(xié)議,它可以自動將數據分片,并且自動將分片的數據組裝。

  也就是說,WebSocket的RFC標準是不會產生粘包、斷包問題的。無需應用層開發(fā)人員關心緩存以及手工組裝message。

  然而理想與現(xiàn)實的不一致:RFC規(guī)范與實現(xiàn)的不一致,現(xiàn)實當中有幾個問題:

  每個message可以是一個或多個分片。message不記錄長度,分片才記錄長度。

  message最大的長度可以達到 9,223,372,036,854,775,807 字節(jié),是由于Payload的數據長度有63bit的限制。

  很多WebSocket的實現(xiàn)其實并不按照標準的RFC實現(xiàn)完全,很多僅僅實現(xiàn)了50%就拿來用了。這就導致了,在WebSocket實現(xiàn)上的最大長度很難達到這個大小,于是,很多API的實現(xiàn)上是會有限制的,可能會限制你的發(fā)送的長度,也可能會把過長的數據直接以流式發(fā)送。

  而SRWebSocket中實現(xiàn)的方式上徹底解決了數據粘包,斷包的可能。

  數據是通過CFStream流的方式回調回來的,每次拿到流數據,都是先放在數據緩沖區(qū)中,然后去讀當前消息幀的頭部,得到當前數據包的大小,然后再去創(chuàng)建消費者對象consumer,去讀取緩沖區(qū)指定數據包大小的內容,讀完才會回調給我們上層用戶,所以,我們如果用SRWebSocket完全不需要考慮數據斷包、粘包的問題,每次到達的數據,都是一條完整的數據。

  接著我們大概來看看這個流程:

  //讀取CRLFCRLFBytes,直到回調回來

  - (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler;

  {

  [self _readUntilBytes:CRLFCRLFBytes length:sizeof(CRLFCRLFBytes) callback:dataHandler];

  }

  //讀取數據 CRLFCRLFBytes,邊界符

  - (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler;

  {

  // TODO optimize so this can continue from where we last searched

  //消費者需要消費的數據大小

  stream_scanner consumer = ^size_t(NSData *data) {

  __block size_t found_size = 0;

  __block size_t match_count = 0;

  //得到數據長度

  size_t size = data.length;

  //得到數據指針

  const unsigned char *buffer = data.bytes;

  for (size_t i = 0; i 《 size; i++ ) {

  //匹配字符

  if (((const unsigned char *)buffer)[i] == ((const unsigned char *)bytes)[match_count]) {

  //匹配數+1

  match_count += 1;

  //如果匹配了

  if (match_count == length) {

  //讀取數據長度等于 i+ 1

  found_size = i + 1;

  break;

  }

  } else {

  match_count = 0;

  }

  }

  //返回要讀取數據的長度,沒匹配成功就是0

  return found_size;

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

用戶評論

      ?
      主站蜘蛛池模板: 国产亚洲福利在线视频 | 美女直播喷水 | 欧美亚洲精品一区二三区8V | 第一精品福利导福航 | 国产极品白嫩超清在线观看 | 古代又黄又肉到湿的爽文 | 久久99热这里只有精品66 | 婷婷六月激情综合一区 | 99国产在线精品视频 | 9久久99久久久精品齐齐综合色圆 | 亚洲国产精品久久无套麻豆 | 亚洲精品白色在线发布 | 亚洲精品人成电影网 | 欧美激情一区二区三区视频 | 夫妻性姿势真人做视频 | 岛国大片在线观看完整版 | 亚洲AV久久无码高潮喷水 | 色哦色哦哦色天天综合 | 男女作爱在线播放免费网页版观看 | 色偷偷成人网免费视频男人的天堂 | 亚洲精品成人a在线观看 | 国产伦精品一区二区三区 | 麻豆精品一卡2卡三卡4卡免费观看 | 菊地凛子av | 琪琪色原网20岁以下热热色原网站 | 国内精品久久久久影院老司 | 久久久伊人影院 | 99国产这里只有精品视频 | 国产毛A片久久久久久无码 国产毛A片啊久久久久久A | 国产一在线精品一区在线观看 | 午夜熟女插插XX免费视频 | 嗯啊快停下我是你老师啊H 嗯啊快拔出来我是你老师视频 | 992交通广播| 国产综合自拍 偷拍在线 | 最近中文字幕2019免费版日本 | 色综合伊人色综合网站下载 | 九九在线精品亚洲国产 | 久久亚洲国产精品亚洲 | 国产亚洲精品首页在线播放 | 999资源站 | 欧美 亚洲 中文字幕 高清 |