0

0

Thrift的java和php数据交互

php中文网

php中文网

发布时间:2016-06-23 13:29:07

|

1103人浏览过

|

来源于php中文网

原创

thrift是一个软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发,封装了数据传输格式(二进制、json)和网络通信的服务框架,提供多语言(c++, java, python, php, ruby, erlang, perl, haskell, c#, cocoa, javascript, node.js, smalltalk, and ocaml)的网络服务器端和客户端程序组件

适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。

本文以注册服务接口和登录服务器接口为教程,

Thrift开发的几个概念:

Server 服务模型

立即学习PHP免费学习笔记(深入)”;

Handler 数据处理接口

Processor 数据处理对象

Protocol 数据传输协议

Transport 数据传输方式


(1)支持的传输格式

TBinaryProtocol ? 二进制格式.

TCompactProtocol ? 压缩格式

TJSONProtocol ? JSON格式

TSimpleJSONProtocol ?提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

TDebugProtocol ? 使用易懂的可读的文本格式,以便于debug

 

(2) 支持的通信方式(数据传输方式)(Transport)

TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中。

THttpTransport:采用Http传输协议进行数据传输

TSocket:采用TCP Socket进行数据传输

TZlibTransport:压缩后对数据进行传输,或者将收到的数据解压

 

下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。

TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer

TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。

TMemoryBuffer:从一个缓冲区中读写数据


(3)支持的服务模型

TSimpleServer ? 简单的单线程服务模型,常用于测试

TThreadedServer - 多线程服务模型,使用阻塞式IO,每个请求创建一个线程。

TThreadPoolServer ? 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。

TNonblockingServer ? 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

芝麻乐开源众筹cms系统
芝麻乐开源众筹cms系统

芝麻乐开源众筹系统采用php+mysql开发,基于MVC开发,适用于各类互联网金融公司使用,程序具备模板分离技术,您可以根据您的需要进行应用扩展来达到更加强大功能。前端使用pintuer、jquery、layer等....系统易于使用和扩展简单的安装和升级向导多重业务逻辑判断,预防出现bug后台图表数据方式,一目了然后台包含但不限于以下功能:用户认证角色管理节点管理管理员管理上传配置支付配置短信平

下载

 

处理大量更新的话,主要是在TThreadedServer和TNonblockingServer中进行选择。TNonblockingServer能够使用少量线程处理大量并发连接,但是延迟较高;TThreadedServer的延迟较低。实际中,TThreadedServer的吞吐量可能会比TNonblockingServer高,但是TThreadedServer的CPU占用要比TNonblockingServer高很多。


服务端编写的一般步骤:

1. 创建Handler

2. 基于Handler创建Processor

3. 创建Transport(通信方式)

4. 创建Protocol方式(设定传输格式)

5. 基于Processor, Transport和Protocol创建Server

6. 运行Server

 

 

客户端编写的一般步骤:

1. 创建Transport

2. 创建Protocol方式

3. 基于Transport和Protocol创建Client

4. 运行Client的方法

上边概述内容参考自:

下面开始正式代码教程

服务描述文件test.thrift,定义了login服务和register

/** * The first thing to know about are types. The available types in Thrift are: * *  bool        Boolean, one byte *  byte        Signed byte *  i16         Signed 16-bit integer *  i32         Signed 32-bit integer *  i64         Signed 64-bit integer *  double      64-bit floating point value *  string      String *  binary      Blob (byte array) *  map<t1,t2>  Map from one type to another *  list<t1>    Ordered list of one type *  set<t1>     Set of unique elements of one type * * Did you also notice that Thrift supports C style comments? */namespace java com.penngonamespace php com.penngostruct User {	1: i64 id,	2: string name,	3: string password}service LoginService{    User login(1:string name, 2:string psw);} service RegisterService{    User createUser(1:string name, 2:string psw);}

使用thrift生成对应平台语言代码

thrift -gen java test.thrift

thrift -gen php test.thrift

如果php需要生成服务器端,需求改为thrift -gen php:server test.thrift

java

实现LoginServiceImpl.java登录接口业务

import org.apache.thrift.TException;public class LoginServiceImpl implements LoginService.Iface{	public LoginServiceImpl(){	}	public User login(String name, String psw) throws TException{		User user = null;		if(name.equals("penngo") && psw.equals("123")){			user = new User();			user.setId(1);			user.setName("penngo");		}		return user;	}}

实现RegisterServiceImpl.java注册接口业务

import org.apache.thrift.TException;public class RegisterServiceImpl implements RegisterService.Iface{	public RegisterServiceImpl(){	}	public User createUser(String name, String psw) throws TException{		User user = new User();		user.setId(2);		user.setName(name);		user.setPassword(psw);		return user;	}}

服务器端java代码

package com.penngo.main;import org.apache.thrift.TMultiplexedProcessor;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TThreadPoolServer;import org.apache.thrift.transport.TServerSocket;import org.apache.thrift.transport.TTransportException;import com.penngo.LoginService;import com.penngo.LoginServiceImpl;import com.penngo.RegisterService;import com.penngo.RegisterServiceImpl;public class Server {	private void start() {		try {			TServerSocket serverTransport = new TServerSocket(7911);			// 用户登录			LoginService.Processor loginProcessor = new LoginService.Processor(					new LoginServiceImpl());			// 用户注册			RegisterService.Processor registerProcessor = new RegisterService.Processor(					new RegisterServiceImpl());			// Factory protFactory = new TBinaryProtocol.Factory(true, true);			// TServer server = new TThreadPoolServer(new			// TThreadPoolServer.Args(serverTransport)			// .processor(loginProcessor));			TMultiplexedProcessor processor = new TMultiplexedProcessor();			processor.registerProcessor("LoginService", loginProcessor);			processor.registerProcessor("RegisterService", registerProcessor);			TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(					serverTransport).processor(processor));			System.out.println("Starting server on port 7911 ...");			server.serve();		} catch (TTransportException e) {			e.printStackTrace();		} catch (Exception e) {			e.printStackTrace();		}	}	public static void main(String args[]) {		Server srv = new Server();		srv.start();	}}

客户端java

package com.penngo.main;import org.apache.thrift.*;import org.apache.thrift.protocol.*;import org.apache.thrift.transport.*;import com.penngo.LoginService;import com.penngo.RegisterService;import com.penngo.User;public class Client {	public static void main(String[] args) {		try {			TTransport transport = new TSocket("localhost", 7911);			TProtocol protocol = new TBinaryProtocol(transport);			TMultiplexedProtocol mp1 = new TMultiplexedProtocol(protocol,					"LoginService");			// TProtocol protocol = new TBinaryProtocol(transport);			// LoginService.Client client = new LoginService.Client(protocol);			LoginService.Client loginClient = new LoginService.Client(mp1);			TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol,					"RegisterService");			RegisterService.Client registerClient = new RegisterService.Client(					mp2);			transport.open();			User user = loginClient.login("penngo", "123");			if (user != null) {				System.out.println("登录成功:" + user.getId() + " "						+ user.getName());			} else {				System.out.println("登录失败");			}			User user2 = registerClient.createUser("test", "123");			if (user2 != null) {				System.out.println("创建用户成功:" + user2.getId() + " "						+ user2.getName());			} else {				System.out.println("创建用户失败");			}			transport.close();		} catch (TException x) {			x.printStackTrace();		}	}}

客户端php

<?phpnamespace com\penngo;require_once __DIR__.'/../../lib/Thrift/ClassLoader/ThriftClassLoader.php';//echo __DIR__.'/../../lib/Thrift/ClassLoader/ThriftClassLoader.php';use Thrift\ClassLoader\ThriftClassLoader;$GEN_DIR = realpath(dirname(__FILE__)).'/../../gen-php';$loader = new ThriftClassLoader();$loader->registerNamespace('Thrift', __DIR__ . '/../../lib');//$loader->registerDefinition('shared', $GEN_DIR);$loader->registerDefinition('com', $GEN_DIR);$loader->register();if (php_sapi_name() == 'cli') {    ini_set("display_errors", "stderr");}use Thrift\Protocol\TBinaryProtocol;use Thrift\Protocol\TMultiplexedProtocol;use Thrift\Transport\TSocket;use Thrift\Transport\THttpClient;use Thrift\Transport\TBufferedTransport;use Thrift\Exception\TException;use com\penngo\RegisterServiceClient;use com\penngo\LoginServiceClient;try {    if (array_search('--http', $argv)) {        //$socket = new THttpClient('localhost', 8080, '/php/PhpServer.php');    } else {        $socket = new TSocket('localhost', 7911);    }    $transport = new TBufferedTransport($socket, 1024, 1024);    $protocol = new TBinaryProtocol($transport);    $loginProtocol = new TMultiplexedProtocol($protocol, "LoginService");    $registerProtocol = new TMultiplexedProtocol($protocol, "RegisterService");    $loginClient = new LoginServiceClient($loginProtocol);    $registerClient = new RegisterServiceClient($registerProtocol);    $transport->open();    $user = $loginClient->login('penngo', '123');    print "user===={$user->id} {$user->name} \n";        $user = $registerClient->createUser('test', '123456');    print "user===={$user->id} {$user->name} \n";    $transport->close();} catch (TException $tx) {    print 'TException: '.$tx->getMessage()."\n";    print 'TException: '.$tx->getTraceAsString()."\n";}?>


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

307

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

183

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

29

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

103

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

54

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

764

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

92

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

微信小程序开发--云开发篇
微信小程序开发--云开发篇

共15课时 | 0.8万人学习

php初学者入门课程
php初学者入门课程

共10课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号