-module(chat_server_passive).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1055).
-define(TCP_OPTIONS, [binary, {packet, 4}, {active, false}]).
%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
register(chat_server, spawn(fun() -> server_loop() end)),
{ok, Listen} = gen_tcp:listen(?DEFPORT, ?TCP_OPTIONS),
do_accept(Listen).
do_accept(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
chat_server ! {new, Socket},
spawn(fun() -> do_recv(Socket) end),
do_accept(Listen).
do_recv(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
chat_server ! {data, Socket, Data},
do_recv(Socket); %% 此句确保可以多次接收客户端信息
{error, _Reason} ->
chat_server ! {fail, Socket}
end.
server_loop() ->
receive
{new, Socket} ->
io:fwrite("Welcome ~p~n", [Socket]);
{data, Socket, Data} ->
io:fwrite("~p: ~p~n", [Socket, binary_to_term(Data)]);
{fail, Socket} ->
io:fwrite("Goodbye ~p, welcome again!~n", [Socket])
end,
server_loop(). %% 此句确保可以多次对chat_server发送消息
=============================================================================
-module(chat_client).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1055).
%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
{ok, Socket} = gen_tcp:connect("localhost", ?DEFPORT, [binary, {packet, 4}]),
do_talk(Socket).
do_talk(Socket) ->
Msg = io:get_line("Input your msg:"),
gen_tcp:send(Socket, term_to_binary(Msg)),
do_talk(Socket).
客户端很逻辑容易实现。最主要的是服务器端的两个递归。