官方地址:http://thrift.apache.org/

 项目一直有用到thrift这东西,thrift的介绍网上也挺多的。

描述:thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

今天写了个servlet服务器端的http请求与as3客户端请求的列子。这里做个笔记哈。

test.thrift


   
   
   
   
  1. namespace java com.xzw.thrift

  2. namespace as3 com.xzw.thrift

  3. struct User{

  4.    1:i32 userId,

  5.    2:string loginName,

  6.    3:string password,

  7.    4:string name

  8. }

  9. exception UserNotFound{

  10.    1:string msg  //as3中由于message是关键字,所以避免使用message关键字。

  11. }

  12. service UserService{

  13. User getUser(1:string loginName) throws (1:UserNotFound unf),

  14.    list<User> getUsers()

  15. }


通过命令生成java代码

>thrift --gen java test.thrift

以上命令会生成gen-java的目录拷贝里面的代码到你的项目中。如图com.xzw.thrift就是

工具生成java类。


thrift的使用—servlet服务器端与as3客户端通信_第1张图片

其中我们需要去实现UserService类中的IFace接口。代码如下:


   
   
   
   
  1. /*

  2. * To change this template, choose Tools | Templates

  3. * and open the template in the editor.

  4. */

  5. package com.xzw.service;

  6. import com.xzw.thrift.User;

  7. import com.xzw.thrift.UserNotFound;

  8. import com.xzw.thrift.UserService;

  9. import java.util.ArrayList;

  10. import java.util.List;

  11. import java.util.logging.Logger;

  12. import org.apache.thrift.TException;

  13. /**

  14. *

  15. * @author xzw

  16. */

  17. publicclass UserServiceHandler implements UserService.Iface{

  18. public User getUser(String loginName) throws UserNotFound, TException {

  19. if(!"xuzhiwei".equals(loginName)){

  20.            UserNotFound e = new UserNotFound("用户无法找到!");

  21. throw e;

  22.        }  

  23.        User user = new User();

  24.        user.setUserId(100);

  25.        user.setLoginName("xuzhiwei");

  26.        user.setPassword("123456");

  27.        user.setName("user1");

  28.        Logger.getLogger("user=>"+user.toString());

  29. return user;  

  30.    }

  31. public List getUsers() throws TException {

  32.       List list = new ArrayList();  

  33.        User user = new User();  

  34.        user.setUserId(100);  

  35.       user.setLoginName("xuzhiwei");

  36.        user.setPassword("123456");

  37.        user.setName("user1");  

  38.        list.add(user);  

  39.        User user2 = new User();  

  40.        user2.setUserId(200);  

  41.        user2.setLoginName("login2");  

  42.        user2.setPassword("pwd2");  

  43.        user2.setName("user2");  

  44.        list.add(user2);  

  45.         Logger.getLogger("user list=>"+list.toString());

  46. return list;  

  47.    }

  48. }


编写servlet,servlet需要继承thrift提供的类包TServlet即可,不需要去重写doGet,doPost方法。


   
   
   
   
  1. /*

  2. * To change this template, choose Tools | Templates

  3. * and open the template in the editor.

  4. */

  5. package com.xzw.service;

  6. import com.xzw.thrift.UserService;

  7. import org.apache.thrift.protocol.TBinaryProtocol;

  8. import org.apache.thrift.server.TServlet;

  9. /**

  10. *

  11. * @author xzw

  12. */

  13. publicclass UserServlet extends TServlet{  

  14. public UserServlet(){  

  15. super(new UserService.Processor(new UserServiceHandler()),new TBinaryProtocol.Factory(true, true));

  16.     }        

  17. }

以上就完成服务器端的编写了。

可以使用junit测试一下:


   
   
   
   
  1. /*

  2. * To change this template, choose Tools | Templates

  3. * and open the template in the editor.

  4. */

  5. import com.xzw.thrift.User;

  6. import com.xzw.thrift.UserService;

  7. import java.util.List;

  8. import java.util.logging.Level;

  9. import java.util.logging.Logger;

  10. import org.apache.thrift.TException;

  11. import org.apache.thrift.protocol.TBinaryProtocol;

  12. import org.apache.thrift.protocol.TProtocol;

  13. import org.apache.thrift.transport.THttpClient;

  14. import org.junit.*;

  15. /**

  16. *

  17. * @author xzw

  18. */

  19. publicclass TestServlet {

  20. @Test

  21. publicvoid test(){

  22.        String serveltUrl = "http://localhost:8080/test_thrift/userServlet";

  23. try {

  24.            THttpClient thc = new THttpClient(serveltUrl);

  25.            TProtocol lopFactory = new TBinaryProtocol(thc);

  26.           UserService.Client client = new UserService.Client(lopFactory);

  27.           List users = client.getUsers();

  28.           System.out.println("-->>"+users.toString());

  29.        } catch (TException ex) {

  30.            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);

  31.        }

  32.   }

  33. @Test

  34. publicvoid test2(){

  35.        String serveltUrl = "http://localhost:8080/test_thrift/userServlet";

  36. try {

  37.            THttpClient thc = new THttpClient(serveltUrl);

  38.            TProtocol lopFactory = new TBinaryProtocol(thc);

  39.           UserService.Client client = new UserService.Client(lopFactory);

  40.           User user = client.getUser("xuzhiwei");

  41.           System.out.println("-->"+user.toString());

  42.        } catch (TException ex) {

  43.            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);

  44.        }

  45.   }

  46. }

接下来生成as3代码

>thrift --gen as3 test.thrift

以上代码会生成gen-as3的目录,拷贝目录下的代码到你的工程中。


thrift的使用—servlet服务器端与as3客户端通信_第2张图片

编写as3客户端类:


   
   
   
   
  1. package

  2. {

  3.    import com.xzw.thrift.User;

  4.    import com.xzw.thrift.UserNotFound;

  5.    import com.xzw.thrift.UserService;

  6.    import com.xzw.thrift.UserServiceImpl;

  7.    import flash.display.Sprite;

  8.    import flash.net.URLRequest;

  9.    import flash.text.TextField;

  10.    import org.apache.thrift.protocol.TBinaryProtocol;

  11.    import org.apache.thrift.protocol.TProtocol;

  12.    import org.apache.thrift.transport.THttpClient;

  13. public class testthrift extends Sprite

  14.    {  

  15.        private const SERVER_URL:String = "http://localhost:8080/test_thrift/userServlet";  

  16.        private var textField:TextField;

  17. publicfunction testthrift()

  18.        {  

  19.            init();

  20.            connServer();  

  21.        }

  22.        private function init():void

  23.        {

  24.            textField = new TextField();  

  25.            textField.width = 300;

  26.            textField.height = 500;  

  27.            textField.autoSize = "left";

  28.            addChild(textField);

  29.        }

  30.        private function connServer():void

  31.        {   //实例化URLRequest

  32.            var urlRequest:URLRequest = new URLRequest(SERVER_URL);

  33.            //实例化THttpClient

  34.            var thc:THttpClient = new THttpClient(urlRequest);

  35.            var protocol:TProtocol = new TBinaryProtocol(thc);

  36.            var usImpl:UserService = new UserServiceImpl(protocol);

  37.            usImpl.getUser("xuzhiwei",onError,onUserSuccess);

  38.            //usImpl.getUsers(onError,onSuccess);

  39.        }

  40.        private function onError(e:UserNotFound):void{

  41.            trace(e);

  42.        }

  43.        private function onUserSuccess(user:User):void{

  44.            trace("success:");

  45.            trace(user);

  46.            textField.text = user.toString();

  47.        }

  48.        private function onSuccess(user:Array):void{

  49.            trace(user);

  50.            textField.text = user.toString();

  51.        }

  52.    }

  53. }


写完了,测试结果

thrift的使用—servlet服务器端与as3客户端通信_第3张图片

thrift目前越来越多人在使用它,但是as3的一直找不到比较完整的例子。今天写了与大家分享哈。

欢迎拍砖。


参考:

http://thrift.apache.org/

http://chamibuddhika.wordpress.com/tag/apache-thrift/

http://wiki.apache.org/thrift/Thrift%20%26%20Eclipse%20%26%20JUnit%20with%20TServlet