flutter下使用protobuf和socket與服務(wù)器通信實(shí)例

閱讀時可能需要你事先對flutter,protobuf有基本了解,flutter的基本操作可以在flutter中文網(wǎng)中找到

在flutter中protobuf的導(dǎo)入

  1. 在pubspec中添加 然后更新
dependencies:
  flutter:
    sdk: flutter
    // 引入protobuf
  protobuf: ^0.13.4
  1. 使用pb的dart插件生成你的模型文件

過程簡單請百度一下

flutter中socket的基本使用

  1. 引入頭文件 創(chuàng)建地址和端口
import 'dart:io';
//地址
const String adress = '你的服務(wù)器地址';
//端口
const int port = 你的服務(wù)器端口;
  1. 設(shè)置一個管理類
class Client {


//socket實(shí)例
  Socket _socket;
//數(shù)據(jù)接收組
  var _recList;

//單例方法
  factory Client() =>_getInstance();

  static Client get instance => _getInstance();

  static Client _instance;

  Client._internal() {

    // 初始化
  }
  static Client _getInstance() {

    if (_instance == null) {

      _instance = new Client._internal();

    }

    return _instance;
  }
}
  1. 初始化socket實(shí)例傳輸并設(shè)置接受數(shù)據(jù)回調(diào)
  Future<Null> startClient() async {

//初始化接收組
    _recList = new List<int>();
//建立鏈接
    _socket=await Socket.connect(adress, port);
//添加數(shù)據(jù)監(jiān)聽
    _socket.transform(base64.encoder).listen((data){
//接受數(shù)據(jù)并處理
      List dataList = base64Decode(data);
  //接收后處理 詳情可見下文
      readData(dataList);
    });
  }

在protobuf中,與服務(wù)器交換的數(shù)據(jù)是模型,而在dart中data類型用List類型表示,因此在本例中使用base64對收回數(shù)據(jù)進(jìn)行編碼后解碼為List以供pb解析

  1. 發(fā)送數(shù)據(jù)
 void sendMsg(List msg){

    _socket.add(msg);

  }

flutter中protobuf的基本使用

構(gòu)建消息體

  1. 引入pb文件以及數(shù)據(jù)處理文件
import 'package:prgramFile/all.pbserver.dart';
import 'package:fixnum/fixnum.dart';

本例中因使用int64類型數(shù)據(jù)因此需引入 fixnum: ^0.10.9

  1. 創(chuàng)建一個消息
const int CLIENT_TAG_BEGIN = 10000;
//心跳包
Msg heartBeatrMsg(){

  HeartbeatReq req = HeartbeatReq.create();
  
  req.count = CLIENT_TAG_BEGIN;
  
  Head head = new Head();
  
  head.msgid = MsgID.heart_beat_id;
  
  Msg msg =new Msg();
  
  msg.head = head;
  
  msg.heartbeatQ = req;
  
  return msg;
}

關(guān)于pb消息構(gòu)建的內(nèi)容可以百度相關(guān)教程

消息的編碼和解碼

使用 Msg.fromBuffer() 方法從二進(jìn)制數(shù)據(jù)獲取模型而昨。

該方法為類方法

使用 msg.writeToBuffer()方法將實(shí)例轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)

該方法為實(shí)例方法

使用Socket與服務(wù)器進(jìn)行pb協(xié)議數(shù)據(jù)傳輸?shù)膶?shí)例

本例中服務(wù)器對數(shù)據(jù)協(xié)議的規(guī)則為消息的前8位是描述一個模型數(shù)據(jù)長度的字符串,不足8位的補(bǔ)"0",根據(jù)后臺對數(shù)據(jù)規(guī)則定義不同因此僅供數(shù)據(jù)處理參考

  1. 對發(fā)出的消息添加描述長度的索引頭
    由于實(shí)際服務(wù)器獲取的是消息的前8個字節(jié)數(shù)據(jù)按照字符串處理,對應(yīng)的純data類型為 Uint8List(8)
    將每一位按照ascII表數(shù)字對應(yīng)即可
  //添加索引頭
  List appendHeaderWithMsg(Msg bodyMsg){
    //獲取消息長度
    String bodyLength = bodyMsg.writeToBuffer().length.toString();
    //補(bǔ)0位數(shù)
    int supplementCount = 8 - bodyMsg.writeToBuffer().length.toString().length;
    //新索引頭
    Uint8List headerList = Uint8List(8);
    //填入索引信息
    for(int i = 0;i < supplementCount; i++){
      //補(bǔ)0
      headerList[i] = 48;
    }
    for(int i = supplementCount;i < 8; i++){
      //有效信息
      headerList[i] = 48 + num.tryParse(bodyLength.substring(i - supplementCount,i - supplementCount + 1));
    }
   //序列化
    List resultList = headerList + bodyMsg.writeToBuffer();

    return resultList;
  }
  1. 發(fā)送消息
  2. 接收以及處理
  void readData(List dataList){
//接收并暫存
  _recList = _recList + dataList;
    //當(dāng)接收到的數(shù)據(jù)長度大于8讀取消息頭
    while(_recList.length > 8 ){

        int headerLength = 8;
       //讀取消息體長度
        int msgLength = int.parse(utf8.decode(_recList.sublist(0,8)));

        int sourceLength = _recList.length;
        //當(dāng)收到的消息超過消息頭描述的消息體長度時取出消息體并解碼
        if(_recList.length >= headerLength + msgLength){

          Msg msg =  Msg.fromBuffer(_recList.sublist(headerLength,headerLength + msgLength));
          //讀取后刪除已讀取的消息
          _recList = _recList.sublist(headerLength + msgLength,sourceLength);
        }

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厨幻,一起剝皮案震驚了整個濱河市覆履,隨后出現(xiàn)的幾起案子病毡,更是在濱河造成了極大的恐慌,老刑警劉巖中狂,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凫碌,死亡現(xiàn)場離奇詭異,居然都是意外死亡胃榕,警方通過查閱死者的電腦和手機(jī)盛险,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門瞄摊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苦掘,你說我怎么就攤上這事换帜。” “怎么了鹤啡?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵惯驼,是天一觀的道長。 經(jīng)常有香客問我递瑰,道長祟牲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任抖部,我火速辦了婚禮说贝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慎颗。我一直安慰自己乡恕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布俯萎。 她就那樣靜靜地躺著傲宜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫啊。 梳的紋絲不亂的頭發(fā)上函卒,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音涮母,去河邊找鬼谆趾。 笑死躁愿,一個胖子當(dāng)著我的面吹牛叛本,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彤钟,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼来候,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逸雹?” 一聲冷哼從身側(cè)響起营搅,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梆砸,沒想到半個月后转质,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帖世,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年休蟹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赂弓,死狀恐怖绑榴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盈魁,我是刑警寧澤翔怎,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站杨耙,受9級特大地震影響赤套,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珊膜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一于毙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辅搬,春花似錦唯沮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溶褪,卻和暖如春币旧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猿妈。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工吹菱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彭则。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓鳍刷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俯抖。 傳聞我的和親對象是個殘疾皇子输瓜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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

  • 本文轉(zhuǎn)自劉明的分享。原文 簡介 什么是 Google Protocol Buffer芬萍? 假如您在網(wǎng)上搜索尤揣,應(yīng)該會得...
    那樣風(fēng)采閱讀 1,595評論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,097評論 1 32
  • 一、基礎(chǔ)知識 參考Protocol Buffers 在游戲中的應(yīng)用[http://disksing.com/pb-...
    合肥黑閱讀 5,636評論 1 13
  • 大多數(shù)人只能記住第一名,最多第二名漫蛔。這種情況嗜愈,是人類的心智模式?jīng)Q定的示罗。不僅生活,商業(yè)也一樣芝硬。 占據(jù)第一大腦份額的蚜点,...
    飛妃1224閱讀 135評論 0 4
  • 高二,十月拌阴, 似乎和夏天青春有關(guān)的字眼就讓人心生聯(lián)想 今天绍绘,和一個未曾謀面,卻認(rèn)識不久的人加了微信 想起那年運(yùn)動會...
    JASPER__ZHOU閱讀 334評論 0 0