私は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二回目は、サーバーのいずれかの応答がないとき。 問題がここにありますか?ありがとうございました。
たとえば、ここで「受け入れ」機能を見てください。http://20bits.com/article/erlang-a-generalized-tcp-server – W55tKQbuRu28Q4xv
偉大なチュートリアル、ありがとうございます。 – goofansu