一、简单版(接收一个连接,关闭监听)
%%---------------------------------------------------------------------------------
%% @doc
%% 服务器
%% @end
%%---------------------------------------------------------------------------------
tcp_server () ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 1}]), %%-----监听
{ok, Socket} = gen_tcp:accept(Listen), %%-----接受,阻塞在这
gen_tcp:close(Listen),
loop(Socket).
loop (Socket) ->
receive
{tcp, Socket, Bin} ->
io:format("Server receive binary is : ~p~n", [Bin]),
Str = erlang:binary_to_term(Bin),
io:format("Server receive String is :~p~n", [Str]),
gen_tcp:send(Socket, erlang:term_to_binary(Str)),
loop(Socket);
{tcp_closed, Socket} ->
io:format("Server Socket closed~n")
end.
%%---------------------------------------------------------------------------------
%% @doc
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
Host = "localhost",
{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
gen_tcp:send(Socket, erlang:term_to_binary(String)),
receive
{tcp, Socket, Bin} ->
io:format("Client receive binary is : ~p~n", [Bin]),
Str = erlang:binary_to_term(Bin),
io:format("Client receive String is :~p~n", [Str]),
gen_tcp:close(Socket)
end.
二、顺序服务端(接收到一个连接,处理完消息,继续监听)
%---------------------------------------------------------------------------------
% @doc
% 服务器,顺序版
% @end
%---------------------------------------------------------------------------------
tcp_server_seq () ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet,1},{reuseaddr, true},{active, true}]),
seq_loop(Listen).
seq_loop (Listen) ->
{ok, Socket} = gen_tcp:accept(Listen), %%-----阻塞在这,知道监听到连接
loop(Socket),
seq_loop(Listen).
loop (Socket) ->
receive %%-----消息接受一次就没有,所以要loop
{tcp, Socket, Bin} ->
io:format("tcp_server_seq receive binary is : ~p~n", [Bin]),
Str = binary_to_term(Bin),
io:format("tcp_server_seq receive string is : ~p~n", [Str]),
gen_tcp:send(Socket, erlang:term_to_binary(Str)),
loop(Socket);
{tcp_closed, Socket} ->
io:format("tcp_server_seq Socket closed~n")
end.
%%---------------------------------------------------------------------------------
%% @doc
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
Host = "localhost",
{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
gen_tcp:send(Socket, erlang:term_to_binary(String)),
receive
{tcp, Socket, Bin} ->
io:format("Client receive binary is : ~p~n", [Bin]),
Str = erlang:binary_to_term(Bin),
io:format("Client receive String is :~p~n", [Str]),
gen_tcp:close(Socket)
end.
三、并发服务端(每当gen_tcp:accept收到一个新连接时立即分裂一个新进程)
%%---------------------------------------------------------------------------------
%% @doc
%% 服务器,并发版
%% @end
%%---------------------------------------------------------------------------------
tcp_server_concurrency () ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 1}]),
erlang:spawn(fun()->concurrency(Listen) end).
concurrency(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
erlang:spawn(fun()->concurrency(Listen) end),
loop(Socket).
loop (Socket) ->
receive %%-----消息接受一次就没有,所以要loop
{tcp, Socket, Bin} ->
io:format("tcp_server_concurrency receive binary is : ~p~n", [Bin]),
Str = binary_to_term(Bin),
io:format("tcp_server_concurrency receive string is : ~p~n", [Str]),
gen_tcp:send(Socket, erlang:term_to_binary(Str)),
loop(Socket);
{tcp_closed, Socket} ->
io:format("tcp_server_concurrency Socket closed~n")
end.
%%---------------------------------------------------------------------------------
%% @doc
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
Host = "localhost",
{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
gen_tcp:send(Socket, erlang:term_to_binary(String)),
receive
{tcp, Socket, Bin} ->
io:format("Client receive binary is : ~p~n", [Bin]),
Str = erlang:binary_to_term(Bin),
io:format("Client receive String is :~p~n", [Str]),
gen_tcp:close(Socket)
end.