Ubuntu 8.0+環境下Thrift的安裝與編譯請參見http://blog.csdn.net/zj_1395201/article/details/6974954
1、首先安裝Cygwin
Cygwin 是一個用於 Windows 的類 UNIX shell 環境。 它由兩個組件組成:一個 UNIX API 庫,它模擬 UNIX 操作系統提供的許多特性;以及 Bash shell 的改寫版本和許多 UNIX 實用程序,它們提供大家熟悉的
UNIX 命令行界面。前一個組件是一個 Windows 動態鏈接庫 (DLL)。後一個組件是一組基於 Cygwin DLL 的程序,其中許多是用未經修改的 UNIX 源代碼編譯的。它們合在一起提供大家熟悉的 UNIX 環境。
具體安裝步驟請參見http://bension8708.blog.163.com/blog/static/81943864201112424922217/
官方文檔上面說明了必須安裝以下包:
- GNU build tools (autoconf 2.60, automake 1.10, libtool 1.5.24)
- boost 1.33.1+
- g++ 4.0+
- bison 2.3-1
- boost 1.33.1-4
- boost-devel 1.33.1-4
- flex 2.5.33-1
- pkgconfig
- libtool
2、安裝Ant
下載Ant,並且配置環境變量
(偶然的發現,我的Ant並沒有放在cygwin模擬的/usr/local/bin下,因爲我之前就下好了,並且在windows中已經配置過,然後我在Cygwin中使用ant居然也可以,呵呵,也許Cygwin環境變量和windows中是可以互相調用的,起碼Ant是這樣的!)
測試Ant:
ok,Ant配置成功
3、下載Thrift最新版本並解壓縮後,開始安裝與編譯吧~
①進入Thrift主目錄
./configure
②這個地方跟在ubuntu下有點不一樣哦~
compiler/cpp
③編譯
make make install
測試一下看看是否成功?
thrift -r
運行結果如圖,ok,終於成功啦,我的機器有點慢,編譯了好長時間。。。
4、編譯Thrift支持Java的Jar包
cd ../.. 進入主目錄
cd lib/java 進入存放jar文件的目錄,
使用ant進行編譯,成功生成build文件夾以及內部的jar包,如圖
5、使用Thrift進行Java服務器與客戶端的通信
①.編寫user.thrift文件
struct User {
1: i32 id,
2: string name,
}
service UserStorage {
void set_user(1: string name)
User get_user(1: i32 id)
}
在此目錄下運行thrift命令,生成相應的java文件
thrift -r -gen java user.thrift
(如果想要生成其他的文件,如ruby,則thrift -r -gen rb user.thrift)
gen-java下面有兩個文件 User.java(對struct User的實現) 和 UserStorage.java(對service UserStorage的實現)
②使用Eclipse新建兩個工程非別導入User.java與UserStorage.java文件
build path,引入lib/java下相關jar文件:
libthrift-0.7.0.jar
commons-codec-1.3.jar
httpcore-4.0.1.jar
slf4j-api-1.5.8.jar
commons-lang-2.5.jar
junit-4.4.jar
slf4j-log4j12-1.5.8.jar
commons-logging-1.1.1.jar
log4j-1.2.14.jar
httpclient-4.0.1.jar
servlet-api-2.5.jar
③Java 服務端代碼:
/** * @author 張進 */ public class JavaServer implements UserStorage.Iface { private User mUser; public JavaServer(){ mUser = new User(); mUser.setId(100); } public static void main(String[] args) { JavaServer handler = new JavaServer(); handler.startServer(handler,9090); } /** * @param handler Server端實例 * @param port 綁定本機端口號 */ public void startServer(JavaServer handler , int port){ try { UserStorage.Processor processor = new UserStorage.Processor(handler); TServerSocket serverTransport = new TServerSocket(port); Factory portFactory = new TBinaryProtocol.Factory(true, true); Args arg = new Args(serverTransport); arg.processor(processor); arg.protocolFactory(portFactory); TServer server = new TThreadPoolServer(arg); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } @Override public void set_user(String name) throws TException { System.out.println("name is "+name); mUser.setName(name); } @Override public User get_user(int id) throws TException { if(100 == id){ return mUser; }else{ return new User(50, "默認用戶"); } } }
④Java客戶端代碼
public class JavaClient extends UserStorage.Client { public JavaClient(TProtocol prot) { super(prot); } public static void main(String[] args) { TTransport transport; transport = new TSocket("localhost", 9090); TProtocol protocol = new TBinaryProtocol(transport); JavaClient client = new JavaClient(protocol); try { transport.open(); client.set_user("新用戶"); User user = client.get_user(50); System.out.println(">>>>>>>>"+user.name); transport.close(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } }
⑥JAVA服務端與JAVA客戶端運行結果:
server:
name is 新用戶
client:
>>>>>>>>默認用戶