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

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

相关文章推荐

Mac下安装jpype遇到的问题

对方答复

不安装oracle客户端也可以使用pl/sql developer

通常情况下,用PL/SQL Developer连接Oracle是需要安装Oracle客户端软件的,这也就意味着你的硬盘将被占用大约1G-2G的空间,对于Windows操作系统来说,你还会多出一些开机自...

thrift JAVA服务端 python客户端的实现

最近用python做网页的抓取,因为想得到JS解释后的HTML,先后尝试了selenium,windmill,htmlunit等web测试框架,因为只要得到html不需要界面展现,最后选择了htmlu...

Thrift java服务端、php客户端

  • 2015年11月06日 11:07
  • 351KB
  • 下载

Netty服务端和客户端调用demo

  • 2015年10月04日 15:09
  • 67KB
  • 下载

C# client 与java netty 服务端的简单通信,客户端采用Unity。

 C#采用socket与java 服务端的简单通信,客户端采用Unity。 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分享一下。 具体请参考...

基于thrift开发的客户端和服务端

  • 2013年10月14日 16:11
  • 1.39MB
  • 下载

dubbo源码分析-客户端DubboInvoker调用服务端体会Netty的非阻塞IO使用

本文会介绍Dubbo客户端DubboInvoker调用服务端时候异步同步调用,借此理解Netty的阻塞非阻塞用法。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习九:(window7上)python客户端通过thrift调用java服务端
举报原因:
原因补充:

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