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.
Zum Beispiel, siehe 'akzeptieren' Funktion hier http://20bit.com/article/erlang-a-generalized-tcp-server – W55tKQbuRu28Q4xv
großes Tutorial, vielen Dank. – goofansu