尝试在iOS上使用gRPC
简介
gRPC,google的远程过程调用框架,传输协议使用 HTTP2, 序列化协议使用 protobuf。
gRPC 使用 HTTP2 传输协议传输 protobuf 序列化的二进制数据,有极高的效率、极低的资源占用率。
github仓库地址:https://github.com/grpc/grpc,该仓库包含在共享C核心库src / core之上编写的多种语言(C++, Python, Ruby, Objective-C, PHP, C#)实现的gRPC库的源代码。
gRPC的一些特性:
- 简单的服务定义
- 跨语言和平台工作
- 快速启动并扩展
- 双向流媒体以及身份验证集成
使用GRPC几大核心步骤
1)Defining a service 定义服务(在.proto文件中这个是和后台交互的主要协议)
2)Generating grpc code 生成grpc代码
3)Writing a server 服务端编写一定的服务提供给客户端使用(类似接口)
4)Server implementation 服务的实现
5)Writing a client 编写客户端代码(集成grpc)
6)Calling an rpc 根据RPC协议(.proto文件约定的协议)进行代码(接口)调用
优点:客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
Objective-C Quick
Start
系统需求
- 最小iOS版本为7.0,即iOS version >=7.0
- OS X 10.11及以上,即OS X 10.11 >= 10.11
前提条件
1、CocoaPods >= 1.0 检查Cocoapods版本:pod –version
$ sudo gem install cocoapods
$ pod setup
PS:CocoaPods是iOS开发、macOS开发中的包依赖管理工具,效果如Java中的Maven,nodejs的npm。
2、Xcode >=7.2
3、Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
PS:Homebrew是一款自由及开放源代码的软件包管理系统,用以简化macOS系统上的软件安装过程
4、autoconf, automake, libtool, pkg-config
$ brew install autoconf automake libtool pkg-config
安装gRPC插件以及二进制库文件
从https://github.com/grpc/grpc下载gRPC源码,解压后进入grpc目录:
$ make
遇到错误:报错很简单,提示系统缺少cares包
从https://github.com/c-ares/c-ares下载cares包后,解压放在/grpc/third_party/cares/cares目录下,重新make,又报错了~,提示缺少OpenSSL,我勒个去,安装一个缺一个,何时是个头啊!grpc的third_party中只是给出了库的仓库地址,但是实际编译时需要的时third_party的全部源码文件。
有效解决方法:Git源码编译(需要网络良好):
$ git clone --recursive -b v1.23.0 https://github.com/grpc/grpc.git
$ cd grpc
$ git submodule update --init
$ make
$ [sudo] make install
完成后会把gRPC的头文件安装在/usr/local/include,在程序中可直接包含使用,链接库则安装在/usr/local/lib中,供程序编译成功后链接使用。
安装protoc编译器
$ brew tap grpc/grpc
$ brew install protobuf
运行Server
对于此示例应用程序,我们需要在本地计算机上运行的gRPC服务器。gRPC Objective-C API支持创建gRPC客户端,但不支持创建gRPC服务器。因此,我们在同一个存储库中构建并运行C ++服务器:
$ cd examples/cpp/helloworld
$ make
$ ./greeter_server &
C++服务端进程greeter_server运行起来了~
运行Client
1)生成客户端库和依赖项
$ cd ../../objective-c/helloworld
$ pod install
2)运行客户端app
$ open HelloWorld.xcworkspace
这将使用Xcode打开应用程序项目。通过按Xcode窗口左上角的“运行”按钮,在iOS模拟器中运行应用程序。你可以检查main.m中的调用代码,并在Xcode的控制台中查看结果。代码将包含字符串“Objective-C”的HLWHelloRequest发送到本地服务器。服务器响应HLWHelloResponse,其中包含一个字符串“Hello Objective-C”,然后输出到控制台。
恭喜!您刚刚使用gRPC成功运行了iOS模拟器客户端-C++服务器应用程序。
iOS真机测试
插入iphone,Xcode识别iphone,并选择为当前设备,配置工程签名信息,构建运行即可!
由于我的Mac OS是在实体机的虚拟机中运行,而实体机使用的是有线光纤网络,和iphone手机所使用的无线网络不在同一个局域网内,所以无法网络联通。
我的笔记本(Windows7 x64)使用的是无线网络,ip地址192.168.2.15,iphone手机ip地址192.168.2.231,是在同一个无线局域网内,可以在笔记本192.168.2.15上运行该gRPC C++ HelloWorld Server程序,但是需要Windows版本的gRPC程序,编译Windows版本的gRPC并使用其HelloWorld Demo程序可参考文章《grpc1.18.0 c++ windows visual studio 2017(vs2017)版本编译(入门)》以及《grpc1.18.0 c++ windows visual studio 2017(vs2017)版本Helloworld示例与解析》。
我这里直接展示最终的结果:
1) gRPC C++ HelloWorld Server
注意:由于该服务端程序是使用VS2017 x64编译出来的,运行时需要zlib.dll以及VS2017的一些运行时库,所以需要安装VS2017才能确保运行(只安装C++开发部分组件即可)。
一点小知识:服务器端的监听地址为"0.0.0.0:50051",0.0.0.0在服务器端它表示本机上的所有IPV4地址,如果一个服务有多个IP地址(192.168.1.2和10.1.1.12),那么我们如果设置的监听地址是0.0.0.0那么我们无论是通过IP192.168.1.2还是10.1.1.12都是可以访问该服务的。
2) gRPC Object-C HelloWorld Client
在Xcode中将连接的服务器地址由@"localhost.15:50051"修改为@"192.168.2.15:50051",之后选择所连接的iOS真机,运行!
测试所使用的iOS真机,借来用的:
恭喜!您刚刚使用gRPC成功运行了iOS真机客户端-C++服务器应用程序。
参考
- gRPC源码编译安装(Linux)
- https://grpc.io/docs/quickstart/objective-c/
- iOS gRPC 初步探索
- gRPC
Basics: C++ - grpc1.18.0 c++ windows visual studio
2017(vs2017)版本编译(入门) - grpc1.18.0 c++ windows visual studio
2017(vs2017)版本Helloworld示例与解析
尝试在iOS上使用gRPC的更多相关文章
- 解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯
---------------------------------------------------------------------------------------------------- ...
- 细数iOS上的那些安全防护
细数iOS上的那些安全防护 龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...
- ios上position:fixed失效问题
手机端上的猫腻真是多啊~~~ 此起彼伏! 最近又遇到了 固定定位的底部导航在ios上被弹出去 此时内心1w+个草泥马奔过~~~~~~~~ 直接上解决方案: <div class="ma ...
- :active 为什么在ios上失效
:active是针对鼠标,而手机上是没有鼠标,而是touchstart,所以早成了ios上不兼容 解决方法是: window.onload = function(){ document.body.ad ...
- iOS上简单推送通知(Push Notification)的实现
iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...
- iOS上new Date出现Invalid Date的问题,
用angular的ngModel绑定time的时候,在安卓调试没问题,没想到在iOS上出现了NaN:NaN,后台丢过来的数据大概是这样的2016-03-08 20:14 然而问题就出在这个分隔符&qu ...
- 尝试在Mac上编译DNX
自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务Ap ...
- javascript的onbeforeunload函数在IOS上运行
今天在做项目的时候,组长让我用iPad测试一下前面写的离线缓存,后退不刷新页面,发现在iPad上onbeforeunload函数在iPad上一带而过,不运行??? 无奈之下,发现原来在IOS上,有自己 ...
随机推荐
- JVM运行机制(非原创)
文章大纲 JVM基本概念 JVM的体系结构 JVM启动流程 一.JVM基本概念 Java虚拟机(JVM)是可运行Java代码的假想计算机 Java虚拟机包括类加载器.一组寄存器.方法区.一个垃圾回收堆 ...
- mssql sqlserver 使用sql脚本剔除数据中的tab、空格、回车等特殊字符的方法分享
摘要: 在sqlserver开发中,常常有同事反馈无法剔除空格,我们可以通过仔细检查发现,并不是空格字符,而是tab键,如下所示: 解决方法: 对于这些特殊字符的替换,我们需采用字符所对应的ascii ...
- Linux与windows的应急响应重点检查项
Linux应急响应重点检查项 用户账号审计: cat /etc/passwd & cat /etc/shadow 在线账户审计: w 登录状况审计: last 空口令账户审计: awk -F: ...
- [Go] vscode配置Go环境
首先要先把环境变量配置好,配置好环境变量打开go文件的时候,会自动提示需要安装的扩展在/root/.profile和/home/当前用户/.profile都加上 export GOPATH=/var/ ...
- 剑指Offer-3.从尾到头打印链表(C++/Java)
题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...
- LG2375/LOJ2246 「NOI2014」动物园 KMP改造
问题描述 LG2375 LOJ2246 题解 看了题解,需要回看,需要继续通过本题深入理解KMP. 为了将 \(\mathrm{KMP}\) 和只插入了一个模式串的\(\mathrm{AC}\)自动机 ...
- ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF
之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...
- 常见算法合集[java源码+持续更新中...]
一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...
- 端口转发之 nc
nc使用方法: Ncat 7.50 ( https://nmap.org/ncat ) Usage: ncat [options] [hostname] [port] Options taking a ...
- 剑指offer:滑动窗口的最大值(栈和队列)
1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别 ...