iOS Protobuf和TCP與伺服器互動
文章概要:本篇是我在實際專案開發中遇到的有關Protobuf相關知識,主要包括兩方面:一是protobuf的安裝和使用;二是protobuf和tcp結合與伺服器互動的使用。內容並不是很完整無誤,但是可以分享給遇到過相同問題的朋友們,又或者即將面對這個問題的你們,有問題的歡迎與我探討!!!
一、Protobuf的安裝和使用
什麼是Protobuf?
Protobuf是谷歌公司提供的一種資料化結構儲存格式,如果protobuf你覺得不熟悉,那麼我說它就類似於xml或者json,你也許就懂了,就是一種儲存資料的格式,什麼時候用呢?通常是與伺服器互動時,用來發送和接收資料。那麼為什麼不用xml或者json呢?使用Protobuf主要因為以下幾點:
2、訊息載體相比xml要輕便靈活,提高解析效能;
3、需要得到自定義的原檔案才能進行反序列化,否則難以解析資料,很好加強了資料保密性。
安裝Protobuf編譯器
首先在Mac上部署安裝環境,用終端進行部署
1、在終端輸入brew -v檢查MAC是否裝有brew,沒有的話就安裝brew,輸入以下命令ruby -e“$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
2、安裝Protobuf編譯器必需的工具brew install automake
brew install libtool
brew install protobuf
3、(可選)為Protobuf編譯器建立一個符號連結
ln -s /usr/local/Cellar/protobuf/2.6.1/bin/protoc /usr/local/bin
4、繼續輸入命令,克隆這個儲存庫
git clone https://github.com/alexeyxo/protobuf-objc.git
5、建立它!
./scripts/build.sh
成功之後如下圖顯示
- 下面提供一個連結,在安裝編譯器的每一步都有詳細介紹和控制檯結果,有問題可以一一對照,
Protobuf的原檔案和OC檔案生成
- 建立原檔案
先在桌面建立一個資料夾,資料夾更名為ProtoBuf
cd ~/Desktop/ProtoBuf
touch person.proto
vi person.proto
proto的檔案內容事例
package web.platform;
message login_account_request
{
required bytes account = 1;
optional bytes passwd = 2;
}
message login_account_response
{
required int32 ec = 1;
optional bytes token = 2;
}
然後儲存退出(按esc,輸入:wq)
這樣就在ProtoBuf的資料夾下面生成了proto檔案,MAC預設沒有可以開啟這個文字檔案的,所以選擇TextEdit.app進行開啟,你可以看到檔案內容
注意:proto的內容格式一定要正確,可以將自己創建出來的文字格式和示例的進行對比,package有沒有拼寫錯誤,需要分號的地方是否有分號,包括大括號的格式。如果內容格式有問題,可能會導致後面無法生成正確的OC檔案
- 將.proto字尾的原檔案生成OC檔案,使用下面的命令
cd ~/Desktop/ProtoBuf
protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out="./"
這樣,就在Protobuf資料夾下面生成了OC檔案,一個.proto檔案會生成person.pb.h和person.pb.m兩個OC檔案
Protobuf在工程中的應用
- 使用cocopods繼承三方庫ProtocolBuffers
proto原檔案一般是伺服器編輯好,你通過以上的方式生成對應的OC檔案,匯入xcode專案中
cd~/Desktop/TestProtoc
pod init
開啟Podfile檔案輸入
pod "ProtocolBuffers", "~> 1.9.7”
關閉Podfile繼續在terminal輸入
pod install
然後終於可以不理terminal了,我們進入工程做事
先把生成的OC檔案匯入到工程中
protobuf的使用主要分為序列化和反序列化,序列化即把protobuf類中的資料轉換成data傳送給伺服器,反序列化即把伺服器傳送的data轉換成protobuf中類的資料。
在ViewController.m檔案中匯入以下檔案
#import <ProtocolBuffers/ProtocolBuffers.h>
#import "person.pb.h"
傳送資料到伺服器
二、Protobuf與TCP的應用
1、以使用者登入為例,下面是一段user.proto的原檔案
message UserLoginComfirm ////id=1;dest=Client 客戶端接收,伺服器傳送
{
required bool success = 1;
required string info = 2;
repeated GameInfo games = 3;
}
message Login ////id=5;dest=Logical 客戶端傳送
{
required int32 userid = 1;
required string session = 2;
}
2.按上面的方式生成User.pb.h 和 User.pb.m的檔案,匯入到專案中 #import "User.pb.h"
3.TCP與伺服器連線成功後,想伺服器傳送登入確認訊息
/** 登入確認*/
- (void)sendUserLoginConfirmMsgWithUserId:(int)userid session:(NSString *)session andCompletion:(OGResultBlock)completion{
if (completion) {
_block = completion;
}
[self socketConnectHost];
// 訊息內容 Login即為User.pb.h中生成的類 protobuf格式轉換成data資料傳送到伺服器
Login *login = [[[[Login builder] setUserid:userid] setSession:session] build];
NSData *sendAllData = [OGSocketUtils sendMessageWithID:5 destNum:3 andMessageData:login.data];
[self.clientSocket writeData:data withTimeout:kWRITE_TIMEOUT tag:0];
}
4.伺服器接收到客戶端傳送的登入確認訊息後,會向客戶端回覆登入結果
- (void)hasReadData:(NSData *)data{
// 伺服器返回的data中含中文的採用GKB編碼,中文輸出為null
NSInteger ID = [OGSocketUtils int16FromBytes:[data subdataWithRange:NSMakeRange(2, 2)]];
NSData *messageData = [data subdataWithRange:NSMakeRange(5, data.length-5)];
if (ID == 1) {// 登入確認,完成proto的反序列化,將接收到的data資料轉換成User.pb.h中生成的類
UserLoginComfirm *login = [UserLoginComfirm parseFromData:messageData];
if (login.success) {
NSLog(@"%d, %@, %@", login.success, login.info , login.games);
} }}
以上就完成了protobuf資料格式的一個基本使用以及如何向伺服器傳送此類訊息!
相關推薦
iOS Protobuf和TCP與伺服器互動
文章概要:本篇是我在實際專案開發中遇到的有關Protobuf相關知識,主要包括兩方面:一是protobuf的安裝和使用;二是protobuf和tcp結合與伺服器互動的使用。內容並不是很完整無誤,但是可
HTTP與伺服器互動的方式get和post的區別
1.http四種互動方式: get和post是HTTP與伺服器互動的方式, 說到方式,其實總共有四種:put,delete,post,get。 他們的作用分別是對伺服器資源的增,刪,改,查。 所以,get是獲取資料,post是修改資料。 2.
iOS中protobuf和tcp長連結(AsyncSocket)scoket配合使用
在ios開發中,客戶端開發最重要的就是資料的獲取和展示了,說到獲取資料,AFN是目前用的最廣的類庫了吧,不過在實時資料tcp獲取上面,我們還是需要用到AsyncSocket這個類庫來進行開發。不過近日聽過網上google的一個protobuf協議十分好用,就研究
Android ListView中的item只能有一個選中的問題和ListView與activity互動的問題
Android中ListView中的item與activity的互動有幾種方式:可以用回撥,廣播等,下面的方式是動態廣播的方式 ListView中的item選中事件,比如有多個item,每個item中都有一個CheckBox,我們要只選擇其中的一個,這是我們需要給每個item設定一
Android使用https與伺服器互動的正確姿勢
HTTPS 使用 SSL 在客戶端和伺服器之間進行加密通訊,錯誤地使用 SSL ,將會導致其它人能夠攔截網路上的應用資料。 使用一個包含公鑰及與其匹配的私鑰的證書配置伺服器,作為 SSL 客戶端與伺服器握手的一部分,伺服器將通過使用公鑰加密簽署其證書來證明自己具有私鑰。 主機平臺一般包含其信任的知名 CA
Web頁面通過MQTT協議與伺服器互動,Mosca安裝測試
在伺服器上安裝node的執行環境和mosca庫 yum install nodejs yum install zeromq-devel mkdir devel cd devel npm install --save mosca node mqttserver.j
react native 與伺服器互動坑
今天遇到兩個坑 一個是以表單formData封裝的JSON格式資料不是標準的json格式,導致伺服器解析資料是錯誤返回400 bad request。例如 let formData = new FormData(); formData.append("api_accou
iOS常用方法——WKWebView與h5互動的實現
隨著前端開發的強大,原生與h5的互動用的也越來越多。 為什麼選用WKWebView,我們可以做一個對比,同一個web頁面,用UIWebView載入和用WKWebView來載入,記憶體佔用情況很容易看出來,回到原生頁面之後,UIWebView對應的記憶體也不會降
使用Activity和Delegate與介面卡互動
在這個Demo裡,我們會分析如何通過委託模式(Delegation Pattern)幫助開發者把所有的業務邏輯從介面卡中移到Activity中。我們建立一個簡單的應用程式,通過該應用程式可以向列表中新增電話號碼,列表中每一行都有一個Remove按鈕,用於刪除電話
瀏覽器與伺服器互動資訊(序列化與發序列化) ViewState
本篇來解釋上篇博文中使用者輸入資料沒有消失的問題。(由於http協議的無狀態性使得每次頁面請求都會重新建立所有控制元件。即所有的資料都將不復存在) 先來看一下asp.net頁面的生命週期 ASP.NET頁面的生命週期:(詳見ASP.Net4.0權威指南第1章第3節) 1.瀏
Android程式與伺服器互動(一)
在公司一個專案中用到了這樣一種網路請求方式,在此記錄學習。 1.java程式碼 /** * 訪問網路改變座位號 */ private void saveSeatNumber() { Controller.g
android與伺服器互動總結(json,post,xUtils,Volley,Gson)
(最後一次更新2016 - 12 - 21) 更新內容:由於android 6.0完全拋棄了HttpClinet,所以,原生的網路請求,建議使用HttpURLConnection,本文的第三方框架,都是去年比較老的,現在xutils都更新到xutils3了,沒有大檔案的網
【iOS開發】H5與Native互動之JSBridge技術
做過混合開發的很多人都知道Ionic和PhoneGap之類的框架,這些框架在web基礎上包了一層Native,然後通過Bridge技術使得js可以呼叫視訊、位置、音訊等功能。本文就是介紹這層Bridge的互動原理,通過閱讀本文你可以瞭解到js與ios及andro
客戶端與伺服器互動使用AES+RSA混合加密原理詳解
前言 最近維護公司APP應用的登入模組,由於測試人員用Fiddler抓包工具抓取到了公司關於登入時候的明文登入資訊。雖然使用的是HTTPS的方式進行http請求的,但還是被Fiddler抓到了明文內容。因此,需要對之前未加密的登入資訊進行加密。在網上搜到一篇關於AES
iOS中原生APP與JS互動 之 WebViewJavascriptBridge 的簡單用法
有時候我們需要跟H5介面做一些簡單的互動功能,這就需要跟JS打交道了。 1、首先初始化一個webview(viewdidload) UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds
Android 客戶端與伺服器互動方式
突然想到一個問題就是Android客戶端與伺服器互動有幾種方式,因為在腦袋裡想當然的就是webservices和json。要在Android手機客戶端與pc伺服器互動,需要滿足下面幾種條件:跨平臺、傳輸資料格式標準、互動方便...。 為了與伺服器通訊其實無非就兩種協議HTT
【Android】Android與伺服器互動 POST上傳多個圖片檔案、文字內容 GET下載圖片
這裡伺服器端採用的是php解析內容 HTTP請求 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。用於資料互動的最基本方法一般為GET、POST、PUT、DELETE。對
【iOS與EV3混合機器人編程系列之四】iOS_WiFi_EV3_Library 剖析之中的一個:WiFi UDP和TCP
microsoft bsp lte lib async stop contex pop 分析 在上一篇文章中。我們通過編寫EV3 Port Viewer項目實現了iOS監測EV3的實時端口數據。程序最核心的部分就是我們的開源碼庫iOS_WiFi_EV3_Library。
客戶端與伺服器之間分別通過TCP和UDP進行通訊
一:TCP/IP協議的應用一般採用客戶/伺服器模式,因此在實際應用中,必須有客戶和伺服器兩個程序,並且首先啟動伺服器,其系統呼叫時序圖如下。面向連線的協議(如TCP)的套接字系統呼叫如圖2.1所示: 注意:伺服器必須首先啟動,直到它執行完accept()呼叫,進入等待狀態後
iOS 開發 Object-C和JavaScript互動詳解之OC與JS互動在WKWebView中使用
1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr