-module(chat_server_active).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1156).
-define(TCP_OPTIONS, [binary, {packet, 0}, {active, true}]).
%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
{ok, Listen} = gen_tcp:listen(?DEFPORT, ?TCP_OPTIONS),
do_accept(Listen).
do_accept(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
io:fwrite("Welcome ~p~n", [Socket]),
%% %% 接收多个客户端的链接,无法获取客户端发送的消息 (recv_loop()中不论是否存在尾递归时)
%% spawn(fun() -> recv_loop(Socket) end),
%% do_accept(Listen).
%% %% 接收多个客户端的链接,每个客户端只能获取第一条消息 (recv_loop()中无尾递归时)
%% %% 接收一个客户端的链接,可获取该客户端的多条消息 (recv_loop()中存在尾递归时)
%% recv_loop(Socket),
%% do_accept(Listen).
%% %% 接收多个客户端的链接,每个客户端只能获取第一条消息 (recv_loop()中无尾递归时)
%% %% 接收一个客户端的链接,可获取该客户端的多条消息 (recv_loop()中存在尾递归时)
%% recv_loop(Socket),
%% spawn(fun() -> do_accept(Listen) end).
%% 接收多个客户端,每个客户端只能获取第一条消息 (recv_loop()中无尾递归)
%% 接收多个客户端,每个客户端都可以获取多条消息 (recv_loop()中存在尾递归)
spawn(fun() -> do_accept(Listen) end),
recv_loop(Socket).
%% %% 接收多个客户端的链接,无法获取任一客户端发送的消息 (recv_loop()中存在尾递归时)
%% spawn(fun() -> recv_loop(Socket) end),
%% spawn(fun() -> do_accept(Listen) end).
recv_loop(Socket) ->
%% io:fwrite("~p recvint...~n", [Socket]),
receive
{tcp, Socket, Data} ->
io:fwrite("~p:~p~n", [Socket, binary_to_term(Data)]),
recv_loop(Socket); %% 确保获取多条客户端信息
{tcp_closed, Socket} ->
io:fwrite("tcp send closed!~n")
end.
不同的递归,结果差别很大。谁能详细解释一下?=========================================================================================
-module(chat_client).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1156).
%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
{ok, Socket} = gen_tcp:connect("localhost", ?DEFPORT, [binary, {packet, 0}]),
do_talk(Socket).
do_talk(Socket) ->
Msg = io:get_line("Input your msg:"),
gen_tcp:send(Socket, term_to_binary(Msg)),
do_talk(Socket).