2016-06-03 7 views
1

schaltet Die Apache Thrift netstack erklärt nett, dass das Transportprotokoll TCP, HTTP, etc. sein kann. Ich konnte jedoch keine richtige Dokumentation finden, die beschreibt, wie ich zwischen der Verwendung von Transportprotokollen darunter schalten kann Vielleicht vermisse ich hier etwas.Wie man Transportprotokolle in Apache Thrift

Auch eine kleine Follow-up-Frage, wie ich vor dem Bau Thrift auf meinem Ubuntu-System konfigurieren (./configure), sehe ich folgendes:

C++ Library: 
    Build TZlibTransport ...... : yes 
    Build TNonblockingServer .. : yes 
    Build TQTcpServer (Qt4) .... : no 
    Build TQTcpServer (Qt5) .... : no 

Sollte ich beunruhigt, dass die TQTcpServer nicht sein konfiguriert wurde gebaut, vorausgesetzt, ich möchte ein TCP-Transportprotokoll verwenden?

Ich bin neu in Thrift, entschuldigen Sie meinen Mangel an Erfahrung für die Frage besser zu gestalten.

+0

"* Sollte ich alarmiert werden, dass der TQTcpServer nicht für den Bau konfiguriert wurde *" - nur wenn Sie Qt verwenden möchten – JensG

Antwort

2

Thrift hat das Konzept von Endpunkttransporten, Schichttransporten und Protokollen, die aufeinander gestapelt sind, um eine konkrete Implementierung zu bilden. Die tutorial zeigt das Grundprinzip (das ist die C++ Version):

boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090)); 
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket)); 
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); 
    CalculatorClient client(protocol); 

Wenn Sie Transporte wechseln, in der Theorie entfernen Sie einfach die TSocket Linie und stecken in einem anderen Transport Ihrer Wahl. In der Praxis mag es etwas mehr Feinheiten geben, aber das ist die Grundidee. Die test suite code kann als ein recht gutes Beispiel dienen, wie dies in der Praxis zu tun:

if (ssl) { 
    factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory()); 
    factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    factory->loadTrustedCertificates(pemPath.c_str()); 
    factory->authenticate(true); 
    socket = factory->createSocket(host, port); 
    } else { 
    if (domain_socket != "") { 
     if (abstract_namespace) { 
     std::string abstract_socket("\0", 1); 
     abstract_socket += domain_socket; 
     socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket)); 
     } else { 
     socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket)); 
     } 
     port = 0; 
    } else { 
     socket = boost::shared_ptr<TSocket>(new TSocket(host, port)); 
    } 
    } 

    if (transport_type.compare("http") == 0) { 
    boost::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service")); 
    transport = httpSocket; 
    } else if (transport_type.compare("framed") == 0) { 
    boost::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket)); 
    transport = framedSocket; 
    } else { 
    boost::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket)); 
    transport = bufferedSocket; 
    } 

Dies ist wiederum C++ und nur die Client-Seite. Es gibt auch eine counterpart for the server end, die sehr ähnlich funktioniert.

+0

Danke für die Erklärung! – Segmented

Verwandte Themen