You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "James E. King, III (JIRA)" <ji...@apache.org> on 2017/12/14 13:56:15 UTC
[jira] [Closed] (THRIFT-4312) Erlang client cannot connect to
Python server: exception error: econnrefused
[ https://issues.apache.org/jira/browse/THRIFT-4312?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James E. King, III closed THRIFT-4312.
--------------------------------------
> Erlang client cannot connect to Python server: exception error: econnrefused
> ----------------------------------------------------------------------------
>
> Key: THRIFT-4312
> URL: https://issues.apache.org/jira/browse/THRIFT-4312
> Project: Thrift
> Issue Type: Bug
> Components: Erlang - Library, Python - Library, Tutorial
> Affects Versions: 0.10.0
> Environment: Windows 10
> Erlang OTP 20
> Python 3.6.2
> Reporter: Walter Weinmann
> Assignee: James E. King, III
> Labels: Connection, Erlang, Python, Tutorial
> Fix For: 0.11.0
>
>
> h3. Connecting the Erlang client with the Python server gives connection error:
> h3.
> h4. Erlang client:
> h4.
> h4.
> -- the examples are taken from the Apache Thrift tutorials ---
> {quote}-module(client).
> -include("calculator_thrift.hrl").
> -export([t/0]).
> p(X) ->
> io:format("~p~n", [X]),
> ok.
> t() ->
> Port = 9090,
> {ok, Client0} = thrift_client_util:new("localhost",
> Port,
> calculator_thrift,
> []),
> {Client1, {ok, ok}} = thrift_client:call(Client0, ping, []),
> io:format("ping~n", []),
> {Client2, {ok, Sum}} = thrift_client:call(Client1, add, [1, 1]),
> io:format("1+1=~p~n", [Sum]),
> {Client3, {ok, Sum1}} = thrift_client:call(Client2, add, [1, 4]),
> io:format("1+4=~p~n", [Sum1]),
> Work = #'Work'{op=?TUTORIAL_OPERATION_SUBTRACT,
> num1=15,
> num2=10},
> {Client4, {ok, Diff}} = thrift_client:call(Client3, calculate, [1, Work]),
> io:format("15-10=~p~n", [Diff]),
> {Client5, {ok, Log}} = thrift_client:call(Client4, getStruct, [1]),
> io:format("Log: ~p~n", [Log]),
> Client6 =
> try
> Work1 = #'Work'{op=?TUTORIAL_OPERATION_DIVIDE,
> num1=1,
> num2=0},
> {ClientS1, {ok, _Quot}} = thrift_client:call(Client5, calculate, [2, Work1]),
> io:format("LAME: exception handling is broken~n", []),
> ClientS1
> catch
> throw:{ClientS2, Z} ->
> io:format("Got exception where expecting - the " ++
> "following is NOT a problem!!!~n"),
> p(Z),
> ClientS2
> end,
> {Client7, {ok, ok}} = thrift_client:call(Client6, zip, []),
> io:format("zip~n", []),
> {_Client8, ok} = thrift_client:close(Client7),
> ok.
> {quote}
> h4. Python server:
> h4.
> {quote}#!/usr/bin/env python
> from tutorial import Calculator
> from tutorial.ttypes import InvalidOperation, Operation
> from shared.ttypes import SharedStruct
> from thrift.transport import TSocket
> from thrift.transport import TTransport
> from thrift.protocol import TBinaryProtocol
> from thrift.server import TServer
> class CalculatorHandler:
> def __init__(self):
> self.log = {}
> def ping(self):
> print('ping()')
> def add(self, n1, n2):
> print('add(%d,%d)' % (n1, n2))
> return n1 + n2
> def calculate(self, logid, work):
> print('calculate(%d, %r)' % (logid, work))
> if work.op == Operation.ADD:
> val = work.num1 + work.num2
> elif work.op == Operation.SUBTRACT:
> val = work.num1 - work.num2
> elif work.op == Operation.MULTIPLY:
> val = work.num1 * work.num2
> elif work.op == Operation.DIVIDE:
> if work.num2 == 0:
> x = InvalidOperation()
> x.whatOp = work.op
> x.why = 'Cannot divide by 0'
> raise x
> val = work.num1 / work.num2
> else:
> x = InvalidOperation()
> x.whatOp = work.op
> x.why = 'Invalid operation'
> raise x
> log = SharedStruct()
> log.key = logid
> log.value = '%d' % (val)
> self.log[logid] = log
> return val
> def getStruct(self, key):
> print('getStruct(%d)' % (key))
> return self.log[key]
> def zip(self):
> print('zip()')
> if __name__ == '__main__':
> handler = CalculatorHandler()
> processor = Calculator.Processor(handler)
> transport = TSocket.TServerSocket(port=9090)
> tfactory = TTransport.TBufferedTransportFactory()
> pfactory = TBinaryProtocol.TBinaryProtocolFactory()
> server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
> # You could do one of these for a multithreaded server
> # server = TServer.TThreadedServer(
> # processor, transport, tfactory, pfactory)
> # server = TServer.TThreadPoolServer(
> # processor, transport, tfactory, pfactory)
> print('Starting the server...')
> server.serve()
> print('done.')
> {quote}
> h4. Runtime protocol:
> h4.
> {quote}EBIN Path : D:\SoftDevelopment\Projects\erlang-and-thrift_idea\erlang-and-thrift\_build\default\lib\erlang_and_thrift\ebin D:\SoftDevelopment\Projects\erlang-and-thrift_idea\erlang-and-thrift\_build\default\lib\jsx\ebin D:\SoftDevelopment\Projects\erlang-and-thrift_idea\erlang-and-thrift\_build\default\lib\thrift\ebin
> ------------------------------------------
> Eshell V9.0 (abort with ^G)
> 1> client:t().
> ** exception error: no match of right hand side value {error,econnrefused}
> in function client:t/0 (d:/SoftDevelopment/Projects/erlang-and-thrift_idea/erlang-and-thrift/_build/default/lib/erlang_and_thrift/src/client.erl, line 33)
> 2> Terminate batch job (Y/N)? y
> D:\SoftDevelopment\Projects\erlang-and-thrift_idea\erlang-and-thrift>tcping64 localhost 9090
> Probing ::1:9090/tcp - Port is open - time=0.580ms
> Probing ::1:9090/tcp - Port is open - time=0.622ms
> Probing ::1:9090/tcp - Port is open - time=1.038ms
> Probing ::1:9090/tcp - Port is open - time=1.050ms
> Ping statistics for ::1:9090
> 4 probes sent.
> 4 successful, 0 failed.
> Approximate trip times in milli-seconds:
> Minimum = 0.580ms, Maximum = 1.050ms, Average = 0.822ms{quote}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)