MitNy.log

About

[Apache Thrift] Ping Pong Test

환경: Ubuntu 16.04 LTS

thrift version : 0.11.0

1.ping_pong thrift 파일을 작성한다.

namespace py ping_pong

service ping_pong
{
  string ping ()
}

thrift --gen py ping_pong.thrift 를 해주면 gen-py 디렉토리가 생성되고, 그 안에 파일들도 생겨난다.

thrift --gen error 시 ImportError: No module named Thrift 이런식으로 thrift 관련 모듈이 없다고 뜬다면 thrift 설치 폴더/thrift-0.11.0/lib/py 에 들어가서 sudo python setup.py install 을 해줍니다.

설치 완료 후 다시 gen을 했을 때 No Module named six이 뜬다면 sudo apt-get install python-six 또는 sudo pip install six를 해주면 된다. 설치가 완료되었다면 다시 gen.

gen-py 디렉토리 안에 ping과 pong을 보낼client.py와 server.py를 작성한다.

Client.py

import time
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
from thrift.Thrift import TException

import ping_pong.ping_pong

socket = TSocket.TSocket('192.168.0.53', 9090)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = ping_pong.ping_pong.Client(protocol)

while(1):
    try:
        transport.open()
        print ">> ping to server"
        print client.ping()
        transport.close()
        time.sleep(1)
    except TException, tx:
        print "%s" % (tx.message)

Server.py

import sys
# thrift 0.11.0
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
from thrift.Thrift import TException

import ping_pong.ping_pong



class ping_pong_server(ping_pong.ping_pong.Processor):
    def __init__(self, my_address, my_port):
        self.my_address = my_address
        self.my_port = my_port

    def startServer(self):
        processor = ping_pong.ping_pong.Processor(self)
        transport = TSocket.TServerSocket(host=self.my_address, port=self.my_port)
        tfactory = TTransport.TBufferedTransportFactory()
        pfactory = TBinaryProtocol.TBinaryProtocolFactory()

        server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)

        print 'Starting the server...'
        server.serve()
        print 'done.'


    def ping(self):
        print "<< ping from client"
	print ">> pong to client"
        return "<< pong from server"

ping_pong_server('192.168.0.53', 9090).startServer();

localhost로 하려고 했으나 VM 두개를 돌려 아예 client와 server를 분리시켰다.

server측 VM의inet addr로 소켓 통신을 할 것이다. server측에서 9090포트를 열고, client는192.168.0.53:9090에 접근 요청을 한다. client측에서는 ping을 보내고 server에서 받은 값을 출력한다. server측엥서는 client에서 보낸 ping을 받고 pong을 return 해준다.

출력은 다음과 같다.