美文网首页python加油站
Mac上brew&thrift安装

Mac上brew&thrift安装

作者: 路与心 | 来源:发表于2016-04-19 11:08 被阅读3825次

    1.缘由

    前几天偶尔在网上看到thrift的信息,其内容和作用极大的引起了我的兴趣,因为我也是做iOS开发的,通过在网上的查询发现信息虽然很多实用的很少,容易误导他人,经过自己的成功实践,做了笔录,为了方便朋友了解和阅读,就也啰里啰嗦的整理一下繁琐的东西,希望对我的朋友和他人能有所帮助。

    2.brew

    我是在Mac上通过终端先安装brew,再在终端输入brew命令行来安装thrift的,当然还有其他的方式,大家可以去网上了解一下,而我用brew是对其偏爱,是因为brew作为Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令, 而不用麻烦的终端命令,非常方便,另外brew 又叫Homebrew。具体安装步骤非常简单如下:

    1,打开终端,输入ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"。当然也可以直接复制这个命令行粘贴到终端,按回车键

    2,然后一会会跳出这个语句:Press RETURN to continue or any other key to abort,其意思就是按回车键继续,或者其他键跳出,当然我们按回车键,然后就开始安装了。

    3,注意,有时候过程可能稍慢,请耐心等候,其以上过程可能需要输入你的本机账号密码,直接输入然后按回车键即可,

    第一次我还不确定是否真的安装成功,就有操作一次结果提醒我已经安装过,再次安装会覆盖以前的,所以大家不用担心再次输入操作,如图:

    brew安装再次输入命令

    使用brew安装软件,通过在终端一行命令即可(brew的命令都是在终端输入的),如:sudo brew install git,就会安装git,我们也可以sudo brew update更新brew,常用命令列示如下:

    1,sudo brew uninstall wget 卸载软件wget

    2,  sudo brew search /wge*/ 查询软件wget

    3,  sudo brew list          列出已安装的软件

    4,  sudo brew home      用浏览器打开brew的官方网站

    5,  sudo brew info        显示软件信息

    6,  sudo brew deps        显示包依赖

    比如:输入3,和4

    输入brew命令

    3,thrift

    当然通过以上就知道如何安装thrift了,只需要在终端输入brew命令行sudo brew install thrift,过程如图:

    图1,过程

    注意过程很慢,可从图最下3.9%,最后安装成功可从下图比较:

    图2 ,结果

    一直到出现你的本机名的时候才算成功

    安装成功大家就可以使用thrift了,如果不了解thrift的朋友可以在网上查查,这里也做一些了解:

    thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言ActionScript3,glibc,cocoa(开发ios用的),C++,C#,delphi,erlang,go,haskell,html,java,javame(山寨机开发),jquery,node.js,Ocaml,perl,php,python,ruby,smalltalk,xsd,简单的说,就是可以让人快速的写Socket Server(服务器)和Client(客户端)。其实不用thrift开发socket也不难,那么为什么要用thrift开发呢?主要有两个原因,一个是因为thrift本身帮你封装了很多基本的东西,你不需要自己去写socket里面的bind,accept之类的,以及他们的逻辑。可以很快速的开发基于进程的,线程的,SSL的socket。第二个理由是标准化,跨语言和跨平台,windows不算在其中。主要是在各种Posix兼容的操作系统中都可以不需要改造基本直接可用,支持的语言种类也很多,基本你会写的,他都支持。你不会写的,他也支持。类似的项目还有ICE和Avro,但是感觉都没有thrift做的易用性好。而且这是facebook开源的诸多项目中,为数不多的能正常编译的软件,

    使用thrift需要先定义接口文件,在thrift里简称叫IDL,全称叫Interface Description Language,接口描述语言。接口描述语言里面需要定义接口中所使用的数据类型,方法等等

    数据类型包括:

    基本类型:

    bool: 布尔类型(true或者false)

    byte: 有符号8位整型

    i16: 有符号16位整型

    i32: 有符号32位整型

    i64: 有符号64位整型

    double: 64位浮点数

    string: UTF8编码的字符串

    特殊类型:

    binary: 未编码的二进制字节流

    struct:结构体类型

    container:

    list:列表,可以理解为数组,其中的元素可以是任意类型的。

    exceptions:

    用来抛出你自己定义的异常情况

    service:

    这个是最重要的定义,有些地方说是虚函数,但是理解成你程序中所使用的方法更容易明白一些。他需要你定义返回类型,这有点类似于C或者java的函数定义。但你要明白,这个返回是给socket的。如果你定义错了,将不仅仅是你得不到返回值这么简单的事情。而是程序会报错

    下面先聚一下网上的一个例子操作了一下还可以:来尝试写第一个thrift文件

    test.thrift

    service test

    {

    string GetSysVer()

    #一个获取系统版本的方法,返回给socket一个字符串

    string FileTransfer(1:string filename, 2:binary content )

    #传送文件的方法,入口参数为string类型的文件名和二进制流类型的文件内容,方法将给socket一个字符串类型的返回值,如果你需要传送结构体,可以在Service外面定义struct File{1:string filename,2:binary content,3:i64:filelen...}等等,然后用list类型赋值给入口参数,例如string FileTransfer(1:list transfer)

    bool FileExists(1:string filename)

    #检查server端指定文件是否存在,返回布尔

    }

    假设我们用Python来写接口:thrift --gen py test.thrift

    server端文件:

    host = '0.0.0.0'

    #监听地址

    port = 12345

    #监听端口

    import sys

    import os

    import platform

    sys.path.append('./gen-py')

    from test import *

    from test.ttypes import *

    # Thrift files

    from thrift.transport import TSocket

    from thrift.transport import TTransport

    from thrift.protocol import TBinaryProtocol

    from thrift.server import TServer

    class testHandler:

    def FileTransfer(self, filename, content):

    filename = filename

    content = content

    f = open(filename,"wb")

    f.write(content)

    f.close()

    return "1"

    def FileExists(self, filename):

    if os.path.isfile(filename):

    return True

    else:

    return False

    def GetSysVer(self):

    system_ver = platform.platform()

    if system_ver.find("el5") > 0:

    title = '5'

    elif system_ver.find("el6") > 0:

    title = '6'

    else:

    title = 'Not CentOS'

    return title

    handler = testHandler()

    processor = test.Processor(handler)

    transport = TSocket.TServerSocket(host,port)

    tfactory = TTransport.TBufferedTransportFactory()

    pfactory = TBinaryProtocol.TBinaryProtocolFactory()

    server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)

    print 'Starting server'

    server.serve()

    这样server端就写完了,来看下client

    host = '127.0.0.1'

    port = 12345

    import sys

    import platform

    sys.path.append('./gen-py')

    from test import *

    from test.ttypes import *

    # Thrift files

    from thrift import Thrift

    from thrift.transport import TSocket

    from thrift.transport import TTransport

    from thrift.protocol import TBinaryProtocol

    try:

    # Init thrift connection and protocol handlers

    transport = TSocket.TSocket(host , port)

    transport = TTransport.TBufferedTransport(transport)

    protocol = TBinaryProtocol.TBinaryProtocol(transport)

    agent = test.Client(protocol)

    transport.open()

    res = agent.FileExists("/root/test.thrift")

    if res == True:

    print "True"

    else:

    print "False"

    filename = "/tmp/Aptana_Studio_3_Setup_Linux_x86_64_3.0.9.zip"

    #定义服务端文件名和保存路径

    f = open("./Aptana_Studio_3_Setup_Linux_x86_64_3.0.9.zip","rb")

    #本地文件路径

    content = f.read()

    f.close()

    boolean = agent.FileTransfer(filename,content)

    res = agent.GetSysVer()

    print res

    transport.close()

    except Thrift.TException, tx:

    print 'Something went wrong : %s' % (tx.message)

    整个Server和Client就写完了,服务器端的代码TThreadedServer是多线程的服务器,可以换成TThreadPoolServer基于线程池的,TSimpleServer是单线程的,TForkingServer基于新启进程的等等根据需要变换。
    当然不仅仅是用python,用什么语言取决于你生成什么样的文件,更取决于你的项目需求。主要的好处就是标准化和跨语言做的很好

    而在iOS客户端,在项目中使用,首先项目中要添加thrift框架,就是从官方gitHub https://github.com/apache/thrift下载源码,然后找到 lib/cocoa,将其拷贝到你工程里,就可以了

    图示

    目前,我了解的就这么多,第一次写东西,不妥之处望大家海涵.......

    相关文章

      网友评论

      • 8ee17f07f741:这个安装完是最新版本的,如何安装0.9.3版本的thrift?
        :pray:
      • 南城同學:请教一下:大神有应用于OC接口的demo没
      • 逐水而上:Last login: Tue Apr 26 09:26:47 on console
        大神,为啥我老是出现这个错误呢,就是不让我安装
        bogon:~ onebitl$ sudo brew install thrift
        Password:
        Error: Cowardly refusing to 'sudo brew install'
        You can use brew with sudo, but only if the brew executable is owned by root.
        However, this is both not recommended and completely unsupported so do so at
        your own risk.
        bogon:~ onebitl$
        iOS_Job:@iOS_onebitL 去掉sudo;
        逐水而上:@iOS_oneBitL急急急。。。

      本文标题:Mac上brew&thrift安装

      本文链接:https://www.haomeiwen.com/subject/ihytfttx.html