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

时间:2022-09-29 11:48:17

概述


本文简单介绍使用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