2012-03-29 3 views
1

Ich bin ein Erlang-Neuling. Wenn ich das Socket-Kapitel von "Programming Erlang" lese und ein paar Beispiele entsprechend dem Tutorial mache, gibt es ein Problem.Socket-Server kann keine Daten annehmen, nachdem der aktive Modus 'einmal' eingestellt wurde

Im Kapitel "The Hybrid Approach (teilweise Blockierung)", muss ich folgendes:

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. 

ich so ein Terminal Dann öffnen: erl

$

Server: Start ().

und öffnen Sie ein anderes Terminal wie folgt aus: $ erl

Client: senddata ("1233").

Bei dem Server, wird es ausgegeben: Server empfangenen binäre = < < 131,107,0,3,49,50,51 >> Server (entpackt) "123" Server antwort = 123

bei Client, wird es ausgegeben: Client-binär = < < 131,97,123 >> Client-Ergebnis = 123

aber erhalten, wenn der Client zweites Mal Senddata, gibt es keine Antwort auf Server. Ist etwas nicht in Ordnung? Vielen Dank.

Antwort

2

Sie Server hören nur eine Verbindung. Sie starten die Funktion sollte auch in einer anderen Schleife sein.

+0

Zum Beispiel, siehe 'akzeptieren' Funktion hier http://20bit.com/article/erlang-a-generalized-tcp-server – W55tKQbuRu28Q4xv

+0

großes Tutorial, vielen Dank. – goofansu

Verwandte Themen