刚接手了一个项目需要修改,用到了Thrift,于是乎就写了一个简单的例子记录一下步骤:
1.下载thrift.exe
2.书写服务代码(参考链接),把后缀名改为hello.thrift 。
namespace java thrift.demo
service Hello{
string sayHello(1:string para)
}
2.2 把文件放到thrift.exe 同一级,进入命令窗口(在目录栏输入cmd回车)。
3.使用thrift命令,生成java文件。thrift -gen java hello.thrift
生成如下
4.新建服务端项目
服务端目录结构:
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jmust</groupId>
<artifactId>thrift</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.11.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
</project>
把生成的java文件放到thrift.demo下
新建实现类HelloImpl.java
package thrift;
import org.apache.thrift.TException;
import thrift.demo.Hello;
public class HelloImpl implements Hello.Iface {
public HelloImpl() {
}
public String sayHello(String username) throws TException {
return "Hi," + username + " welcome to thrift demo";
}
}
新建ThriftServer.java
package thrift.server;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.TTransportFactory;
import thrift.demo.Hello;
import thrift.impl.HelloImpl;
public class ThriftServer {
public void startServer() {
try {
System.out.println("Starting Server......");
TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloImpl());
TServerSocket serverTransport = new TServerSocket(10086);
TTransportFactory transportFactory = new TFramedTransport.Factory();
Factory factory = new TBinaryProtocol.Factory();
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.protocolFactory(factory);
tArgs.transportFactory(transportFactory);
tArgs.processor(processor);
// 简单的单线程服务模型,一般用于测试
TServer server = new TSimpleServer(tArgs);
server.serve();
} catch (TTransportException e) {
System.out.println("Starting Thrift Server......Error!!!");
e.printStackTrace();
}
}
public static void main(String[] args) {
ThriftServer server = new ThriftServer();
server.startServer();
}
}
5.新建客户端项目
客户端目录结构:
新建ThriftClient.java
package thrift.client;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import thrift.demo.Hello;
import thrift.demo.Hello.Client;
public class ThriftClient {
public static void main(String[] args) {
try {
TTransport transport = new TFramedTransport(new TSocket("127.0.0.1", 10086, 5000));
// 协议要和服务端一致
TProtocol protocol = new TBinaryProtocol(transport);
Client client = new Hello.Client(protocol);
transport.open();
String string = client.sayHello("keys");
System.out.println(string);
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}
6.先启动服务端,在启动客户端