本文借鑒自
目前累計服務客戶千余家,積累了豐富的產(chǎn)品開發(fā)及服務經(jīng)驗。以網(wǎng)站設計水平和技術實力,樹立企業(yè)形象,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設計、網(wǎng)絡營銷、VI設計、網(wǎng)站改版、漏洞修補等服務。創(chuàng)新互聯(lián)始終以務實、誠信為根本,不斷創(chuàng)新和提高建站品質,通過對領先技術的掌握、對創(chuàng)意設計的研究、對客戶形象的視覺傳遞、對應用系統(tǒng)的結合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。http://www.jianshu.com/p/0f4113d6ec4b
(下面稱簡書教程)
首先上官網(wǎng)下載代碼
https://thrift.apache.org/download
下載源碼thrift-0.9.3.tar.gz
解壓之后放在路徑C:\thrift-0.9.3\thrift-0.9.3
并下載windows執(zhí)行版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
配置環(huán)境變量
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中創(chuàng)建一個文本文件
復制代碼
namespace java com.winwill.thrift
enum RequestType {
SAY_HELLO, //問好
QUERY_TIME, //詢問時間}struct Request {
1: required RequestType type; // 請求的類型,必選
2: required string name; // 發(fā)起請求的人的名字,必選
3: optional i32 age; // 發(fā)起請求的人的年齡,可選
}
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
執(zhí)行命令thrift-0.9.3 -gen java Test.thrift
會在路徑C:\thrift-0.9.3下生成一個文件夾gen-java
在Eclipse中創(chuàng)建工程TestThrift
按照簡書教程生成package
com.winwill.thrift
把上面生成的gen-java中的代碼復制到package中
并在package中創(chuàng)建代碼,由于可能跟簡書教程使用的版本不同,簡書教程中的某些寫法無法編譯,
經(jīng)過修改后使用如下代碼
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 {
// 實現(xiàn)這個方法完成具體的邏輯。
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);
// 創(chuàng)建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)
說明已經(jīng)成功連接啦
本文所用到的工具和工程已經(jīng)打包上傳到云盤,歡迎大家下載
鏈接:http://pan.baidu.com/s/1jHQXSma 密碼:65uh
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。