netty学习九:(window7上)python客户端通过thrift调用java服务端

原创 2017年08月10日 11:34:25

概述


本文简单介绍使用python编写客户端代码,通过thrift rpc框架,调用java端远程服务。


在64位window 7上安装python


python对应的下载链接:python下载

本文使用的版本是

python-2.7.9

下载完后文件名字是

python-2.7.9.amd64.msi

点击直接安装,一路next即可。

将python配置到path路径上,配置成功后,启动CMD,执行

python

正常情况下会出现

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

下载JetBrains PyCharm


python最好的IDE当属PyCharm,下载链接为:phcharm下载

下载完的安装文件名是

pycharm-professional-2017.2.exe

点击安装,一路next。

安装完成后,直接创建python工程,工程名字为python_thrift,创建的过程中,PyCharm会自动识别已经安装到window的python。

创建一个test.py文件,编写代码

print "hello"

右键文件,选择【Run ‘test’】,正常情况下会输出

hello

到此window上的python环境搞定了。


编写thrift idl文件


编写animal.thrift

namespace java thrift.generated
namespace py py.thrift.generated
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Animal {
 1: optional String username,
 2: optional int age,
 3: optional boolean married
}

exception DataException {
 1: optional String message,
 2: optional String callStack,
 3: optional boolean date
}

service AnimalService {
  Animal getAnimalByUsername(1: required String name) throws (1: DataException dataException),
  void saveAnimal(1: required Animal animal) throws (1: DataException dataException)
}

animal.thrift完整路径是

src/main/java/thrift/py/animal.thrift

针对python,需要加入如下一行代码

namespace py py.thrift.generated


使用thrift编译器生成python客户端类


执行命令

thrift –gen py src/main/java/thrift/py/animal.thrift

注意是gen前面是两个-,不是一个- .

执行成功后会生成gen-py目录

gen-py
py
   thrift
     generated
       AnimalService-remote
       AnimalService.py
       constants.py
       ttypes.py

编写java服务端业务类


package thrift.py;

import org.apache.thrift.TException;

import thrift.py.generated.Animal;
import thrift.py.generated.AnimalService;
import thrift.py.generated.DataException;

/**
 * 业务层服务类 
 *
 */
public class AnimalBizService implements AnimalService.Iface{

    @Override
    public Animal getAnimalByUsername(String name) throws DataException, TException {
        System.out.println("client name:"+name);
        Animal animal = new Animal();
        animal.setUsername(name);
        animal.setAge(34);
        animal.setMarried(true);

        return animal;
    }

    @Override
    public void saveAnimal(Animal animal) throws DataException, TException {
        System.out.println("saveAnimal");
        System.out.println(animal.getUsername());
        System.out.println(animal.getAge());
        System.out.println(animal.isMarried());
    }

}

通常用thrift生成service后,会用一个业务实现类来实现thrift servce接口,完成业务逻辑.


Thrift Server端代码


package thrift.py;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.THsHaServer.Args;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

import thrift.py.generated.AnimalService;

public class ThriftServer {

    public static void main(String[] args) throws TTransportException {
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
        Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);

        AnimalService.Processor<AnimalBizService> processors = new AnimalService.Processor<>(new AnimalBizService());
        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processors));

        TServer server = new THsHaServer(arg);
        server.serve();
    }
}

到此java服务端的相关类已经编写完毕。


下载pytion thrift依赖包


之前的netty学习八:在window上安装thrift以及第一个小demo 一文中,编写java thrift代码的时候,是需要依赖一个java包

libthrift-0.10.0.jar

同样编写python thrift代码的时候,也需要一个python依赖包

如何下载这个依赖包呢?可以从thrift源码包 取到。

首先使用thrift源码包这个链接下载

thrift-0.10.0.tar.gz

解压后,使用CMD命令行切换到

lib\py

目录下,使用

python setup.py install

安装依赖包,安装成功后,可以到python的安装目录中的Lib\site-packages找到

thrift-0.10.0-py2.7.egg

到此python thrift依赖包安装成功。


编写python thrift 客户端代码


第一步:拷贝thrift生成的python代码到python工程中

将之前生成的

gen-py
py
   thrift
     generated
       AnimalService-remote
       AnimalService.py
       constants.py
       ttypes.py

代码拷贝到之前创建的python_thrift工程中的根目录中去.


第二步:编写python客户端代码

新建立一个python_client.py文件,代码如下

from py.thrift.generated import AnimalService
from py.thrift.generated import ttypes

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TCompactProtocol

try:
    tSocket = TSocket.TSocket('localhost',8899)
    tSocket.setTimeout(600)

    transport = TTransport.TFramedTransport(tSocket)
    protocol = TCompactProtocol.TCompactProtocol(transport)
    client = AnimalService.Client(protocol)

    transport.open();
    animal = client.getAnimalByUsername("Sam")

    print animal.username
    print animal.age
    print animal.married

    newAnimal = ttypes.Animal()
    newAnimal.username = "Sam2"
    newAnimal.age = 33
    newAnimal.married = False
except Thrift.TException, tx:
    print '%s' % tx.message

运行代码


运行ThriftServer类的main方法启动服务端,运行python_client.py代码启动客户端,正常情况下会打印如下日志:

Sam
34
True

csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。

netty_study

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Oracle的悲观锁和乐观锁

为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么...

Java NIO框架Netty教程(三) – Object对象传递

说了这么多废话,才提到对象的传输,不知道您是不是已经不耐烦了。一个系统内部的消息传递,没有对象传递是不太现实的。下面就来说说,怎么传递对象。 如果,您看过前面的介绍,如果您善于专注本质,勤于思考。您应...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Netty实现原理浅析

Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研...

通过Guice 进行依赖项注入

构造器注入 public class FrogMan{ @Inject public FrogMan(Vehicle vehicle) { this.vehicle = vehicle; ...

Java NIO框架Netty教程(四) – ServerBootStrap启动流程源码分析

花了几天时间,仔细梳理了一下Netty的源码,总结了一下ServerBootStrap的启动和任务处理流程,基本涵盖了Netty的关键架构。   OneCoder总结了一张流程图:    ...

DataGrid使用心得(附大量代码)

1. 为 DataGrid 控件设计样式        在之后添加如下代码                 &...

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...

3个netty5的例子,简单介绍netty的用法

3个netty5的例子,简单介绍netty的用法
  • tjbsl
  • tjbsl
  • 2016-04-01 18:49
  • 11988
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)