Thrift:Python服务器,Erlang客户端错误...... {thrift_socket_server,244,{child_error,function_clause,[]}}

时间:2013-07-05 17:24:02

标签: python erlang thrift

这实际上是我关于stackoverflow的第一个问题,但我遇到了一个我似乎无法解决的问题。我正在制作一个通过thrift调用erlang客户端的Python服务器。我在thrift中做的唯一一个函数叫做bar,它接受一个整数并打印条形(整数)。这是Python客户端,它并不太复杂:

#!/usr/bin/env python

import sys
sys.path.append('../gen-py')

from foo import Foo
from foo.ttypes import *
from foo.constants import *

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

try:
   # Make socket
   transport = TSocket.TSocket('localhost', 9999)

   # Buffering is critical. Raw sockets are very slow
   transport = TTransport.TBufferedTransport(transport)

   # Wrap in a protocol
   protocol = TBinaryProtocol.TBinaryProtocol(transport)

   # Create a client to use the protocol encoder
   client = Foo.Client(protocol)

   # Connect!
   transport.open()

   msg = client.bar(1452)
   print msg

   transport.close()

except Thrift.TException, tx:
   print "%s" % (tx.message)

这是我的thrift客户端,它正在侦听端口9999:

-module(foo_service).

-include("foo_thrift.hrl").
-include("foo_types.hrl").

-export([start_link/0, stop/1,
         handle_function/2,

% Thrift implementations
% FILL IN HERE
         bar/1]).

%%%%% EXTERNAL INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

start_link() ->
  thrift_socket_server:start ([{port, get_port()},
                               {name, ?MODULE},
                               {service, foo_thrift},
                               {handler, ?MODULE},
                               {framed, true},
                               {socket_opts, [{recv_timeout, 60*60*1000}]}]).

stop(_Server) ->
  thrift_socket_server:stop (?MODULE),
  ok.

%%%%% THRIFT INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
  case apply(?MODULE, Function, tuple_to_list(Args)) of
    ok -> ok;
    Reply -> {reply, Reply}
  end.

%%%%% HELPER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

get_port() ->
  {ok, Result} = application:get_env(foo, service_port),
  Result.

%% ADD THRIFT FUNCTIONS HERE
bar(I) ->
  io:format("bar (~p)~n", [I]).

所以我启动了thrift客户端,并从python服务器调用client.bar(1452),不幸的是得到了一个孩子错误:

=CRASH REPORT==== 5-Jul-2013::08:34:32 ===
  crasher:
    initial call: thrift_socket_server:acceptor_loop/1
    pid: <0.51.0>
    registered_name: []
    exception error: no function clause matching 
                     thrift_socket_transport:read({data,#Port<0.1067>,3600000},
                                                  -2147418111) (src/thrift_socket_transport.erl, line 53)
      in function  thrift_transport:read/2 (src/thrift_transport.erl, line 67)
      in call from thrift_framed_transport:read/2 (src/thrift_framed_transport.erl, line 79)
      in call from thrift_transport:read/2 (src/thrift_transport.erl, line 67)
      in call from thrift_binary_protocol:read_data/2 (src/thrift_binary_protocol.erl, line 315)
      in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 286)
      in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 175)
      in call from thrift_protocol:read_specific/2 (src/thrift_protocol.erl, line 186)
    ancestors: [foo_service,foo_sup,<0.46.0>]
    messages: []
    links: [<0.48.0>,#Port<0.1067>]
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 987
    stack_size: 27
    reductions: 513
  neighbours:

=ERROR REPORT==== 5-Jul-2013::08:34:32 ===
{thrift_socket_server,244,{child_error,function_clause,[]}}

任何想法?谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

想出来!我在我的erlang文件中指定了框架传输时,我正在使用TBufferedTransport。我把它改成了TFramedTrasport,重新编译了我的节俭文件,一切都很顺利。