日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ThriftUsageC++ - Thrift Wiki

系統(tǒng) 3044 0

ThriftUsageC++ - Thrift Wiki

Getting started

?

The first thing you need to know is that the C++ code generated by Thrift compiles only on Unix based systems, although some success has been reported using Cygwin on Win32 in ThriftInstallationWin32 . ? ?

?

Requirements

?

Make sure that your system meets the requirements as noted in ThriftRequirements ? ?

  • Thrift library files ?
  • Thrift header files. ? ?

?

Installing the Thrift library

?

Installing the Thrift library is trivial to link with the generated code. ? ?

  1. Download a snapshot of Thrift and extract if you haven't done so already - Direct Link ?

  2. Navigate to lib/cpp using the terminal of your choice ?

  3. Run ?make to compile ?

  4. Run ?make?install to install the library. Your user needs root permissions. ? ?

?

Generating the server code

?

In this example we use an imaginary file called your_thrift_file.thrift : ? ?

? ? ? ?

      #!/usr/local/bin/thrift --gen cpp

namespace cpp Test

service Something {
  i32 ping()
}
    

Now run:

?

      thrift --gen cpp your_thrift_file.thrift
    

?

Exploring the generated code - The Server

The generated code should be under the gen-cpp directory. You will see a number of generated C++ and header files along with an automatically generated server skeleton code (in bold).

  • Something.cpp
  • Something.h
  • Something_server.skeleton.cpp

  • your_thrift_file_constants.cpp
  • your_thrift_file_constants.h
  • your_thrift_file_types.cpp
  • your_thrift_file_types.h

?

Implementing the Server

Copy the generated server skeleton to a file named Something_server.cpp and keep the original:

?

      cp Something_server.skeleton.cpp Something_server.cpp
    

When this server is run in console it prints "ping" on the console window each time the function is called from a client.

Here's the autogenerated skeleton file to illustrate how to write a server: Something_server.cpp

?

      #include "Something.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TTransportUtils.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 Test;

class SomethingHandler : virtual public SomethingIf {
 public:
  SomethingHandler() {
   // Your initialization goes here
  }

  int32_t ping() {
   // Your implementation goes here
    printf("ping\n");
  }

};

int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr<SomethingHandler> handler(new SomethingHandler());
  shared_ptr<TProcessor> processor(new SomethingProcessor(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;
}
    

?

Compiling/Building the server

To quickly build a binary using a single command use:

?

      g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -o something
    

?

Compiling

You need to point your compiler to the thrift include path (CXX flag: ?-I/usr/local/include/thrift )

?

      g++ -Wall -I/usr/local/include/thrift -c Something.cpp -o something.o
g++ -Wall -I/usr/local/include/thrift -c Something_server.cpp -o server.o
g++ -Wall -I/usr/local/include/thrift -c your_thrift_file_constants.cpp -o constants.o
g++ -Wall -I/usr/local/include/thrift -c your_thrift_file_types.cpp -o types.o
    

?

Linking

You need to point your linker to the thrift library. (Linker flag: ?-lthrift? or ?-l/usr/local/lib/libthrift.so? )

?

      g++ -L/usr/local/lib *.o -o Something_server -lthrift
    

?

Writing the client code

thrift does not auto generate a client interface, so you have to create the file.

?

      #include "Something.h"  // As an example

#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>

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

using namespace Test;

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));

  SomethingClient client(protocol);
  transport->open();
  client.ping();
  transport->close();

  return 0;
}
    

?

Compiling

?

      g++ -Wall -I/usr/local/include/thrift -c Something_client.cpp -o client.o
    

?

Linking

?

      g++ -L/usr/local/lib client.o Something.o constants.o types.o -o Something_client -lthrift
    

?

Compiling/Building everything with Makefile

?

      GEN_SRC := Something.cpp your_thrift_file_constants.cpp your_thrift_file_types.cpp
GEN_OBJ := $(patsubst %.cpp,%.o, $(GEN_SRC))

THRIFT_DIR := /usr/local/include/thrift
BOOST_DIR := /usr/local/include

INC := -I$(THRIFT_DIR) -I$(BOOST_DIR)

.PHONY: all clean

all: something_server something_client

%.o: %.cpp
        $(CXX) -Wall -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H $(INC) -c $Slt; -o $@

something_server: Something_server.o $(GEN_OBJ)
        $(CXX) $^ -o $@ -L/usr/local/lib -lthrift 

something_client: Something_client.o $(GEN_OBJ)
        $(CXX) $^ -o $@ -L/usr/local/lib -lthrift 

clean:
        $(RM) *.o something_server something_client
    

?

Appendix: About TNonblockingServer

If you are writing an application that will serve a lot of connection (like php front end calling thrift service), you'd better use TNonblockingServer. TNonblockingServer can accept a lot of connections while throttling the processor threads using a pool.

* TNonblockingServer with a thread pool is the c++ alternative of the JAVA THsHaServer; * TNonblockingServer withOUT a thread pool is the c++ alternative of the JAVA TNonblockingServer;

Server code with thread pool:

          shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

    // using thread pool with maximum 15 threads to handle incoming requests
    shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15);
    shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
    threadManager->threadFactory(threadFactory);
    threadManager->start();
    TNonblockingServer server(processor, protocolFactory, 8888, threadManager);
    server.serve();

    // ...
    

C++ client code (you have to use TFramedTransport here):

          boost::shared_ptr<TSocket> socket(new TSocket("localhost", 8888));
    boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

    SomethingClient client(protocol);
    transport->open();
    // do something here...
    transport->close();
    

PHP client code (you have to use TFramedTransport here):

          $transport = new TFramedTransport(new TSocket("localhost", 8888));
    $transport->open();
    $protocol = new TBinaryProtocol($transport);
    $client= new SomethingClient($protocol, $protocol);
    // do something here...
    transport->close();
    

ThriftUsageC++ - Thrift Wiki


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 正镶白旗| 南昌市| 抚远县| 肇州县| 宽城| 武冈市| 朝阳区| 成安县| 甘肃省| 深水埗区| 峨眉山市| 济源市| 南城县| 伊春市| 新龙县| 永泰县| 东光县| 元朗区| 菏泽市| 健康| 安西县| 塔城市| 竹溪县| 师宗县| 桓台县| 乐昌市| 大兴区| 孙吴县| 望奎县| 铅山县| 泉州市| 贵阳市| 金堂县| 景泰县| 调兵山市| 福清市| 彩票| 兰州市| 平邑县| 临高县| 巴彦县|