1. 程式人生 > 其它 >thrift JAVA使用示例(可與C++/QT互相訪問)

thrift JAVA使用示例(可與C++/QT互相訪問)

技術標籤:thriftjavaqt

thrift JAVA使用示例(可與C++/QT互相訪問)

JAVA客戶端、伺服器端/QT客戶端、伺服器端

上一篇文章 搭建C++的thrift環境之後,本文繼續實現thrift的JAVA伺服器端和客戶端,thrift仍然使用上一篇使用的add.thrift。

//add.thrift
//a + b
service AddService{ 
	i32 add(1: i32 num1, 2: i32 num2)
}

(1)生成java介面檔案

thrift -r --gen java add.thrift

(2)編寫java客戶端和服務端

本文使用IDEA編輯器,首先新建專案,並新增Maven依賴。

java對thrift的支援很完善,只需要引入maven,不像c++一樣需要自行編譯依賴庫。

        <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>
0.13.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.21</version> </dependency>

專案的整體目錄如下

AddClient:客戶端
AddServer:伺服器端
AddService:thrift檔案產生的程式碼,主要是Iface和client
AddServiceImpl:介面的實現類

在Addservice中,Iface是個介面檔案,主要是用來被伺服器端的程式繼承和重寫的,Iface裡面定義了方法的介面,在伺服器端的程式中應當實現這個介面,而client程式中定義了add 方法,而add方法中又呼叫了send_add和 recv_add 用來發送請求和接受反饋,具體通訊的細節不用使用者去考慮,thrift已經幫我們完全生成好了,只需要我們具體實現add的方法即可。

AddServiceImpl.java:實現了AddService的Iface介面

import org.apache.thrift.TException;

public class AddServiceImpl implements AddService.Iface{

    @Override
    public int add(int num1, int num2) throws TException {
        System.out.println("num1:" + num1);
        System.out.println("num2:" + num2);
        return num1 + num2;
    }
}

AddClient.java:呼叫AddService的client即可,client呼叫add方法,向伺服器傳遞引數,並接受伺服器返回的資訊。

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

public class AddClient {

    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 9090;
    public static final int TIMEOUT = 30000;

    public void startClient(int a, int b) {
        TTransport transport = null;
        try {
            // 建立TTransport
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            // 建立TProtocol 協議要與服務端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            // 建立client
            AddService.Client client = new AddService.Client(protocol);
            // 建立連線
            transport.open();
            // client呼叫server端方法
            int result = client.add(a,b);
            System.out.println("thirft client result =: " + result);
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            // 請求結束,斷開連線
            if (null != transport) {
                transport.close();
            }
        }
    }

    public static void main(String[] args) {
        AddClient client = new AddClient();
        client.startClient(1, 2);

    }
}

AddServer.java:impl檔案只會在伺服器端被呼叫,來規定伺服器端返回的資訊

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;

public class AddServer {

    public static final int SERVER_PORT = 9090;

    public void startServer() {
        try {
            System.out.println("HelloService TSimpleServer start ....");

            // Transport 簡單的單執行緒服務模型,一般用於測試
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            // Processor
            TProcessor tprocessor = new AddService.Processor<AddService.Iface>(new AddServiceImpl());

            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            // Server
            TServer server = new TSimpleServer(tArgs);
            server.serve();

        } catch (Exception e) {
            System.out.println("Server start error!!!");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        AddServer server = new AddServer();
        server.startServer();
    }
}

與上一篇文章的QT例項合起來,可以通過thrift實現java和c++的互相呼叫。