2012-03-29 15 views
1

私はerlang初心者です。 "Programming Erlang"のSocketの章を読み、チュートリアルに従っていくつかの例を実行すると、問題があります。章でアクティブモード「一度」に設定した後、ソケットサーバーはデータを受け入れることができません。

"ハイブリッドアプローチ(部分的なブロッキング)"、私は次のようにします。 $ ERL

サーバー:開始(

loop(Socket)-> 
receive 
{tcp, Socket, Bin} -> 
    io:format("Server received binary = ~p~n",[Bin]), 
    Str = binary_to_term(Bin), 
    io:format("Server (unpacked) ~p~n",[Str]), 
    Reply = lib_misc:string2value(Str), 
    io:format("Server replying = ~p~n",[Reply]), 
    gen_tcp:send(Socket, term_to_binary(Reply)), 

    inet:setopts(Socket,[binary,{active, once}]), %Configure socket as active 
    loop(Socket); 
{tcp_closed, Socket} -> 
    io:format("Server socket closed~n") 
end. 

start()-> 
{ok,Listen} = gen_tcp:listen(2345,[binary,{packet,4}, 
        {reuseaddr, true}, 
        {active, once}]), 
{ok, Socket} = gen_tcp:accept(Listen), 
loop(Socket). 

sendData(Str)-> 
{ok,Socket}=gen_tcp:connect("localhost",2345,[binary,{packet,4}]), 
ok=gen_tcp:send(Socket, term_to_binary(Str)), 
receive 
{tcp,Socket,Bin}-> 
    io:format("Client received binary = ~p~n",[Bin]), 
    Val = binary_to_term(Bin), 
    io:format("Client result=~p~n",[Val]) 
    % gen_tcp:close(Socket) 
end. 

それから私はこのような一つの端末を開きます)。

と、このような別の端末開く: $ ERL

クライアント:のsendData( "1233")。サーバにおける

、それが出力されます: サーババイナリ= < < 131,107,0,3,49,50,51 >> サーバ(アンパック) "123" サーバー返信する= 123

を受けクライアントでは、これます出力: クライアントがバイナリ= < < 131,97,123 >> クライアントの結果= 123

を受けた。しかし、クライアントのsendData二回目は、サーバーのいずれかの応答がないとき。 問題がここにありますか?ありがとうございました。

答えて

2

あなたはサーバーをlistenします 1つの接続。あなたは関数も別のループにあるはずです。

+0

たとえば、ここで「受け入れ」機能を見てください。http://20bits.com/article/erlang-a-generalized-tcp-server – W55tKQbuRu28Q4xv

+0

偉大なチュートリアル、ありがとうございます。 – goofansu

関連する問題