1. 程式人生 > >iOS Protobuf和TCP與伺服器互動

iOS Protobuf和TCP與伺服器互動

文章概要:本篇是我在實際專案開發中遇到的有關Protobuf相關知識,主要包括兩方面:一是protobuf的安裝和使用;二是protobuf和tcp結合與伺服器互動的使用。內容並不是很完整無誤,但是可以分享給遇到過相同問題的朋友們,又或者即將面對這個問題的你們,有問題的歡迎與我探討!!!

一、Protobuf的安裝和使用

什麼是Protobuf?

        Protobuf是谷歌公司提供的一種資料化結構儲存格式,如果protobuf你覺得不熟悉,那麼我說它就類似於xml或者json,你也許就懂了,就是一種儲存資料的格式,什麼時候用呢?通常是與伺服器互動時,用來發送和接收資料。那麼為什麼不用xml或者json呢?使用Protobuf主要因為以下幾點:

       1、資料結構可以自定義,便於各個平臺的資料轉換;
       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 ProtobufTCP伺服器互動

文章概要:本篇是我在實際專案開發中遇到的有關Protobuf相關知識,主要包括兩方面:一是protobuf的安裝和使用;二是protobuf和tcp結合與伺服器互動的使用。內容並不是很完整無誤,但是可

HTTP伺服器互動的方式getpost的區別

1.http四種互動方式: get和post是HTTP與伺服器互動的方式,  說到方式,其實總共有四種:put,delete,post,get。  他們的作用分別是對伺服器資源的增,刪,改,查。  所以,get是獲取資料,post是修改資料。 2.

iOSprotobuftcp長連結(AsyncSocket)scoket配合使用

在ios開發中,客戶端開發最重要的就是資料的獲取和展示了,說到獲取資料,AFN是目前用的最廣的類庫了吧,不過在實時資料tcp獲取上面,我們還是需要用到AsyncSocket這個類庫來進行開發。不過近日聽過網上google的一個protobuf協議十分好用,就研究

Android ListView中的item只能有一個選中的問題ListViewactivity互動的問題

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常用方法——WKWebViewh5互動的實現

隨著前端開發的強大,原生與h5的互動用的也越來越多。 為什麼選用WKWebView,我們可以做一個對比,同一個web頁面,用UIWebView載入和用WKWebView來載入,記憶體佔用情況很容易看出來,回到原生頁面之後,UIWebView對應的記憶體也不會降

使用ActivityDelegate介面卡互動

在這個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開發】H5Native互動之JSBridge技術

做過混合開發的很多人都知道Ionic和PhoneGap之類的框架,這些框架在web基礎上包了一層Native,然後通過Bridge技術使得js可以呼叫視訊、位置、音訊等功能。本文就是介紹這層Bridge的互動原理,通過閱讀本文你可以瞭解到js與ios及andro

客戶端伺服器互動使用AES+RSA混合加密原理詳解

前言 最近維護公司APP應用的登入模組,由於測試人員用Fiddler抓包工具抓取到了公司關於登入時候的明文登入資訊。雖然使用的是HTTPS的方式進行http請求的,但還是被Fiddler抓到了明文內容。因此,需要對之前未加密的登入資訊進行加密。在網上搜到一篇關於AES

iOS中原生APPJS互動 之 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。對

iOSEV3混合機器人編程系列之四】iOS_WiFi_EV3_Library 剖析之中的一個:WiFi UDPTCP

microsoft bsp lte lib async stop contex pop 分析 在上一篇文章中。我們通過編寫EV3 Port Viewer項目實現了iOS監測EV3的實時端口數據。程序最核心的部分就是我們的開源碼庫iOS_WiFi_EV3_Library。

客戶端伺服器之間分別通過TCPUDP進行通訊

一:TCP/IP協議的應用一般採用客戶/伺服器模式,因此在實際應用中,必須有客戶和伺服器兩個程序,並且首先啟動伺服器,其系統呼叫時序圖如下。面向連線的協議(如TCP)的套接字系統呼叫如圖2.1所示: 注意:伺服器必須首先啟動,直到它執行完accept()呼叫,進入等待狀態後

iOS 開發 Object-CJavaScript互動詳解之OCJS互動在WKWebView中使用

1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr