thrift JAVA使用示例(可與C++/QT互相訪問)
阿新 • • 發佈:2020-12-14
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依賴。
<!-- 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++的互相呼叫。