IM(Socket)編程--ProtocolBuffer數(shù)據(jù)通信

進行Socket編程, 常見使用的協(xié)議UDP/TCP
TCP:傳輸控制協(xié)議 。是專門設(shè)計用于在不可靠的因特網(wǎng)上提供可靠的,端到端的字節(jié)流通信的協(xié)議。它是一種面向連接的協(xié)議。TCP連接是字節(jié)流而非報文流。
UDP:用戶數(shù)據(jù)報協(xié)議 。不需要建立連接,不可靠。

iOS中Socket編程
●BSD Socket
BSD Socket 是UNIX系統(tǒng)中通用的網(wǎng)絡(luò)接口,它不僅支持各種不同的網(wǎng)絡(luò)類型,而且也是一種內(nèi)部進程之間的通信機制。在我們iOS中也可以使用,但是它所有的函數(shù)都是基于C語言的,所有在實際的項目開發(fā)中,我們都是使用封裝好的。
●CFSocket
CFSocket是蘋果官方提供給我們進行Socket編程,里面還是有很多C語言的東西,使用起來稍微麻煩一點。
●AsyncSocket
AsyncSocket是一個開源的庫,用來進行iOS的Socket編程就非常方便, 但是目前只有OC版本, 并且長時間沒有更新
●ysocket
目前使用Swift進行Socket編程時,常用的一個庫

消息傳輸
TCP在傳輸數(shù)據(jù)時,傳輸?shù)氖亲止?jié)流
在讀取消息時,需要知道數(shù)據(jù)的長度, 否則就會出現(xiàn)讀取不完整或者讀取長度過多的情況, 因此讀取方法要求我們傳入本次讀取的消息長度
如何解決該問題呢?
方案一: 客戶端發(fā)送兩次消息
消息一是記錄后續(xù)消息長度, 消息二是真正的消息

1.png

方案二: 客戶端發(fā)送一次消息
消息有一個Header,用于記錄消息的長度, 后續(xù)為真實消息內(nèi)容
2.png

消息類型
開發(fā)中經(jīng)常遇到類似這樣的場景:
我們的客戶端是使用Swift/OC/Java來寫的, 可以運行在不同的平臺, iOS/Android/Window/Linux.服務(wù)器基于Linux平臺并使用C++開發(fā)完成的, 兩種程序之間采用什么進行通信呢?

  • 直接傳遞C/C++語言中一字節(jié)對齊的結(jié)構(gòu)體數(shù)據(jù),只要結(jié)構(gòu)體的聲明為定長格式,那么該方式對于C/C++程序而言就非常方便了, 但是對于java這種不常用結(jié)構(gòu)體的語言, 處理起來就相當麻煩
  • 使用SOAP協(xié)議(WebService)作為消息報文的格式載體,由該方式生成的報文是基于文本格式的,同時還存在大量的XML描述信息,因此將會大大增加網(wǎng)絡(luò)IO的負擔。又由于XML解析的復雜性,這也會大幅降低報文解析的性能。總之,使用該設(shè)計方式將會使系統(tǒng)的整體運行性能明顯下降。
  • Json交換格式, 目前比較理想的一種通信格式, 也是在Http請求數(shù)據(jù)時, 最常見的用法(Demo程序)
  • ProtocolBuffer(也稱PB/GPB): google 的一種數(shù)據(jù)交換的格式, 可以實現(xiàn)跨平臺, 方便的序列化&反序列化, 并且數(shù)據(jù)量相對json

Json/GPB對比優(yōu)缺點對比

  • 跨平臺
    ProtoBuf支持多平臺和語言, 包括C++/Java/Python等等
  • 序列化&反序列號
    ProtoBuf支持直接將對象序列化成Data, 也支持直接將Data序列化為對象類型
  • 消息大小
    一條消息數(shù)據(jù),用protobuf序列化后的大小是json的10分之一xml格式的20分之一,是二進制序列化的10分之一
    對于即時通信消息來說, 減小數(shù)據(jù)量的大小非常有必須

主題:
ProtocolBuffer使用
1.ProtocolBuffer環(huán)境安裝
How To Install Protobuf Compiler from Homebrew

1.ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2.brew install protobuf-swift
How To Install Protobuf Compiler
1.ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.brew install automake

3.brew install libtool

4.brew install protobuf

5.git clone git@github.com:alexeyxo/protobuf-swift.git

6../scripts/build.sh

Add ./src/ProtocolBuffers/ProtocolBuffers.xcodeproj in your project.

2.ProtocolBuffer的使用

2.1 創(chuàng)建.proto文件
在項目中, 創(chuàng)建一個(或多個).proto文件
之后會通過該文件, 自動幫我們生成需要的源文件(比如C++生成.cpp源文件, 比如java生成.java源文件, Swift就生成.swift源文件)


3.jpg
4.png

源碼規(guī)范

syntax = "proto2";
message GiftMessage {
    required int64 id = 1;
    required string name = 2;
    optional string email = 3;
}

具體說明

● syntax = "proto2"; 為定義使用的版本號, 目前常用版本proto2/proto3
● message是消息定義的關(guān)鍵字,等同于C++/Swift中的struct/class,或是Java中的class
● Person為消息的名字,等同于結(jié)構(gòu)體名或類名
● required前綴表示該字段為必要字段,既在序列化和反序列化之前該字段必須已經(jīng)被賦值
● optional前綴表示該字段為可選字段, 既在序列化和反序列化時可以沒有被賦值
● repeated通常被用在數(shù)組字段中
● int64和string分別表示整型和字符串型的消息字段
● id和name和email分別表示消息字段名,等同于Swift或是C++中的成員變量名
● 標簽數(shù)字1和2則表示不同的字段在序列化后的二進制數(shù)據(jù)中的布局位置, 需要注意的是該值在同一message中不能重復

2.2 .代碼編寫完成后, 生成對應語言代碼
cd +文件夾目錄
protoc 文件名.proto --swift_out="./“

 protoc IMText.proto --swift_out="./“

3.用法:

 //1.創(chuàng)建giftMsg 
   let giftMsg = GiftMessage.Builder()
   giftMsg.giftname  = giftname
   giftMsg.giftUrl = giftURL
   giftMsg.giftCount = giftCount
        
//2.獲取對應的data
   let giftData = (try! giftMsg.build()).data() 
//3.發(fā)送禮物消息
   sendMsg(data: giftData, type: 3)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,156評論 4 61
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 UI下拉刷新模糊效果A...
    袁俊亮技術(shù)博客閱讀 11,947評論 9 105
  • 讓我遇見你 我想在春天遇見你趁南雁歸來,童心不老 我想在冬天遇見你趁夜吻深夢,雪花飄飄 我想遇見你,在沒有憂愁的年...
    吳佩在天涯閱讀 284評論 2 1
  • 喂。 喂。 是XX嗎? 對。 是我。 嗯? 是我。聽出我聲音了嗎? 啊? 哦。
    天空中的魚閱讀 361評論 0 1
  • 都想做社交,運動類做社交有難點,無論是動動還是keep,動動的社交很弱,所以大概初衷就沒想做社交,但是keep社交...
    ziee閱讀 538評論 0 0