thrift的使用—servlet服务器端与as3客户端通信

简介:

 项目一直有用到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类。


其中我们需要去实现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<User> getUsers() throws TException {

  32.       List<User> list = new ArrayList<User>();  

  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的目录,拷贝目录下的代码到你的工程中。


编写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目前越来越多人在使用它,但是as3的一直找不到比较完整的例子。今天写了与大家分享哈。

欢迎拍砖。


本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/1184540,如需转载请自行联系原作者

相关文章
|
9月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
2151 5
|
12月前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
[Git] 深入理解 Git 的客户端与服务器角色
|
10月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
541 10
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
2723 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
302 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
730 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
699 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
278 4
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
235 2
|
安全 区块链 数据库