windows下vs2015搭建thrift,以及如何使用NuGet

windows第一次搭建thrift服务器(c++)

  • 第一次使用thrift,网上找了很多资源,最后自己总结一下。我这里搭建的是c++版本的,在vs2015建立空的控制台项目,然后调用libthrift.lib实现
  • 准备工作:
    先官网下载thrift源码,我下载的0.10.0版本解压后这里写图片描述

    进入lib/cpp目录,用vs2015打开sln项目,里面如图!这里写图片描述

    可以看到就只有两个lib工程(1个阻塞的libthrift,另一个是非阻塞的libthriftnb)

  • 到这一步了,如果直接点生成,肯定会报很多找不到XXX的错误,接下来解决错误

  • 先把环境配置好,怎么配呢,很简单,这里不需要配置什么属性啊(这里给NuGet点个赞,有了它不需要配置属性,可从此vs变得超级便利,我感觉)。步骤如图这里写图片描述这里写图片描述
    这里如果用的阻塞的就只要添加boost和openssl就行,如果用非阻塞还得多加一个libevent的库。把这些库添加进来后,会发现那些找不到boost的h文件的错误都消失了。这时候可以生成lib库了(这里注意自己的release和debug,还有win32和x64)。

  • libthrift.lib生成好之后,下载这里写图片描述

  • 然后编写faceDector.thrift文件`
namespace cpp faceDector
struct User{
    1:i64 id,
    2:string name,
    3:i32 age,
    4:bool vip

}
service FaceDector{
    i32 add(1:i32 a,2:i32 b)
    string faceDector(1:string username,2:string password)
}`
  • 然后用命令行生成一堆h文件和cpp文件。命令行如下图这里写图片描述
  • 会在gen-cpp文件夹下生成的文件这里写图片描述
  • 看一下FaceDector_server.skeleton.cpp
 - // This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

#include "FaceDector.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

using namespace  ::faceDector;

class FaceDectorHandler : virtual public FaceDectorIf {
 public:
  FaceDectorHandler() {
    // Your initialization goes here
  }

  int32_t add(const int32_t a, const int32_t b) {
    // Your implementation goes here
    printf("add\n");
    return 1;
  }

  void faceDector(std::string& _return, const std::string& username, const std::string& password) {
    // Your implementation goes here
    printf("faceDector\n");
  }

};

int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr<FaceDectorHandler> handler(new FaceDectorHandler());
  shared_ptr<TProcessor> processor(new FaceDectorProcessor(handler));
  shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
  shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
  shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  server.serve();
  return 0;
}
  • 把生成的这一堆文件复制到开始建立的空项目里面,同样的把boost和openssl的库添加进来,然后还把原来生成的libthrift.lib 配置进来:
  • 属性–>链接器–>常规–>附加库目录
    . 这里写图片描述
  • 属性–>链接器–>常规–>输入

    . 这里写图片描述

  • 属性–>c/c++–>常规–>附加包含目录
    这里写图片描述

  • 看下整体目录结构
    这里写图片描述

  • include文件夹下是把原来thrift-0.10.0\lib\cpp\src目录下的thrift复制过来的,因为这里面保函了thrift的h文件和cpp文件
    这里写图片描述

  • 到此配置完毕,点编译运行,接着报错(我在这里耗了好久好久),错误如下
    这里写图片描述看到这里第一反应就是还少库,毕竟第一次弄,也不知道到底少什么库。最后的发现的原因是:这里写图片描述是不是觉得很狗血,这是官网下的源码,有这个坑。把lib/cpp/server下的所有文件添加到thrift项目后,再生成lib,再复制过来调用就没问题了,服务器就启动成功这里写图片描述

  • 接下来就是客户端了,服务端的代码是命令行生成的,客户端得自己写一个client.cpp,重新建立空项目,把原来命令行生成的文件除了FaceDector_server.skeleton.cpp不要,全都复制进去,然后自己写个client.cpp

 - #include <iostream>
#include "FaceDector.h"   
#include <thrift/transport/TSocket.h>  
#include <thrift/transport/TBufferTransports.h>  
#include <thrift/protocol/TBinaryProtocol.h>


using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using boost::shared_ptr;

int main(int argc, char **argv) {
    boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

    faceDector::FaceDectorClient client(protocol);
    try {
        transport->open();
        int res = client.add(100, 200);
        // 我们的代码写在这里  
        if(res == 1)
            printf("sss");
        transport->close();

    }
    catch(TException& tx){

        printf("error:",tx.what());
    }
    return 0;
}
  • 环境配置跟服务器那边一样的,最后启动结果证明能和服务器通信,可以调用那边的方法并能返回,意味着成功了
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值