Thrift 學習筆記2——Windows環境下Thrift的安裝、編譯以及測試

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
所以在安裝Cygwin時請務必選擇安裝上述包,(圖省事的童鞋可以安裝Cygwin的所有包,安裝完整版本的好處是可以儘可能的在windows環境下模擬linux環境,便於項目的移植!缺點就是太耗時了.。。。)


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:

>>>>>>>>默認用戶



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章