重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文借鉴自
目前累计服务客户千余家,积累了丰富的产品开发及服务经验。以网站设计水平和技术实力,树立企业形象,为客户提供成都做网站、成都网站制作、网站策划、网页设计、网络营销、VI设计、网站改版、漏洞修补等服务。创新互联始终以务实、诚信为根本,不断创新和提高建站品质,通过对领先技术的掌握、对创意设计的研究、对客户形象的视觉传递、对应用系统的结合,为客户提供更好的一站式互联网解决方案,携手广大客户,共同发展进步。http://www.jianshu.com/p/0f4113d6ec4b
(下面称简书教程)
首先上官网下载代码
https://thrift.apache.org/download
下载源码thrift-0.9.3.tar.gz
解压之后放在路径C:\thrift-0.9.3\thrift-0.9.3
并下载windows执行版thrift-0.9.3.exe
放在路径C:\thrift-0.9.3下
下载apache ant项目,用于打jar包
下载路径
http://ant.apache.org/bindownload.cgi
解压之后放在路径C:\apache-ant-1.9.7-bin\apache-ant-1.9.7
配置环境变量
ANT_HOME : C:\apache-ant-1.9.7-bin\apache-ant-1.9.7
把C:\apache-ant-1.9.7-bin\apache-ant-1.9.7\bin\ant.bat复制到路径C:\thrift-0.9.3\thrift-0.9.3\lib\java下
在cmd中运行ant.bat,会生成jar包libthrift-0.9.3 在路径C:\thrift-0.9.3\thrift-0.9.3\lib\java\build
在路径C:\thrift-0.9.3中创建一个文本文件
复制代码
namespace java com.winwill.thrift
enum RequestType {
SAY_HELLO, //问好
QUERY_TIME, //询问时间}struct Request {
1: required RequestType type; // 请求的类型,必选
2: required string name; // 发起请求的人的名字,必选
3: optional i32 age; // 发起请求的人的年龄,可选
}
exception RequestException {
1: required i32 code;
2: optional string reason;
}
// 服务名
service HelloWordService {
string doAction(1: Request request) throws (1:RequestException qe);
// 可能抛出异常。
}
保存为Test.thrift
在cmd中进入路径C:\thrift-0.9.3
执行命令thrift-0.9.3 -gen java Test.thrift
会在路径C:\thrift-0.9.3下生成一个文件夹gen-java
在Eclipse中创建工程TestThrift
按照简书教程生成package
com.winwill.thrift
把上面生成的gen-java中的代码复制到package中
并在package中创建代码,由于可能跟简书教程使用的版本不同,简书教程中的某些写法无法编译,
经过修改后使用如下代码
1.服务端
package com.winwill.thrift;
import org.apache.commons.lang3.StringUtils;
import org.apache.thrift.TException;
import java.util.Date;
public class HelloWordServiceImpl implements com.winwill.thrift.HelloWordService.Iface {
// 实现这个方法完成具体的逻辑。
public String doAction(com.winwill.thrift.Request request) throws com.winwill.thrift.RequestException, TException {
System.out.println("Get request: " + request);
if (StringUtils.isBlank(request.getName()) || request.getType() == null) {
throw new com.winwill.thrift.RequestException();
}
String result = "Hello, " + request.getName();
if (request.getType() == com.winwill.thrift.RequestType.SAY_HELLO) {
result += ", Welcome!";
} else {
result += ", Now is " + new Date().toLocaleString();
}
return result;
}
}
2.启动服务
package com.winwill.thrift;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TFastFramedTransport;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportFactory;
import org.slf4j.*;
import java.net.ServerSocket;
public class HelloWordServer {
public static void main(String[] args) throws Exception {
int port = 7912;
String transport_type = "buffered";
String protocol_type = "binary";
String server_type = "thread-pool";
String domain_socket = "";
// ServerSocket socket = new ServerSocket(7912);
// Protocol factory
TProtocolFactory tProtocolFactory = null;
if (protocol_type.equals("json")) {
tProtocolFactory = new TJSONProtocol.Factory();
} else if (protocol_type.equals("compact")) {
tProtocolFactory = new TCompactProtocol.Factory();
} else {
tProtocolFactory = new TBinaryProtocol.Factory();
}
TTransportFactory tTransportFactory = null;
if (transport_type.equals("framed")) {
tTransportFactory = new TFramedTransport.Factory();
} else if (transport_type.equals("fastframed")) {
tTransportFactory = new TFastFramedTransport.Factory();
} else { // .equals("buffered") => default value
tTransportFactory = new TTransportFactory();
}
TServerSocket serverTransport = new TServerSocket(new TServerSocket.ServerSocketTransportArgs().port(port));;
com.winwill.thrift.HelloWordService.Processor processor = new com.winwill.thrift.HelloWordService.Processor(new HelloWordServiceImpl());
TServer.Args tServerArgs = new TServer.Args(serverTransport);
tServerArgs.processor(processor);
tServerArgs.protocolFactory(tProtocolFactory);
tServerArgs.transportFactory(tTransportFactory);
TServer server = new TSimpleServer(tServerArgs);
System.out.println("Running server...");
server.serve();
}
}
3.客户端请求
package com.winwill.thrift;
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 HelloWordClient {
public static void main(String[] args) throws Exception {
TTransport transport = new TSocket("【此处使用服务器ip地址】", 7912);
TProtocol protocol = new TBinaryProtocol(transport);
// 创建client
com.winwill.thrift.HelloWordService.Client client = new com.winwill.thrift.HelloWordService.Client(protocol);
transport.open(); // 建立连接
// 第一种请求类型
com.winwill.thrift.Request request = new com.winwill.thrift.Request()
.setType(com.winwill.thrift.RequestType.SAY_HELLO).setName("winwill2012").setAge(24);
System.out.println(client.doAction(request));
// 第二种请求类型
request.setType(com.winwill.thrift.RequestType.QUERY_TIME).setName("winwill2012");
System.out.println(client.doAction(request));
transport.close(); // 请求结束,断开连接
}
}
在一台服务器上测试启动服务
输出Running server...
在另一台机器启动客户端
输出
Hello, winwill2012, Welcome!
Hello, winwill2012, Now is 2016-10-13 17:06:47
此时服务器端输出
Get request: Request(type:SAY_HELLO, name:winwill2012, age:24)
Get request: Request(type:QUERY_TIME, name:winwill2012, age:24)
说明已经成功连接啦
本文所用到的工具和工程已经打包上传到云盘,欢迎大家下载
链接:http://pan.baidu.com/s/1jHQXSma 密码:65uh
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。