level 4
今早好好学习
楼主
%% @author google
%% @doc @todo Add description to erlTcpSer.
-module(erlTcpSer).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
%%{active, true} 主动模式, 客户端速度过快可能导致服务端内存不足而崩溃
%%{active, false} 被动模式, 在接收数据的地方调用 gen_tcp:recv ,可能等待一个具体的客户端而阻塞在那里
%%{active, once} 半阻塞模式, 主动仅针对一个消息,在控制进程发送完一个数据后,必须显示调用inet:setopts(Socket, [{active, once}])
%%重新激活以便接收下一个消息(在次之前处于阻塞状态),可实现流量控制防止服务器被过多消息淹没。
start () ->
case gen_tcp:listen (2345, [binary, {packet, 4}, {reuseaddr, true}, {active, once}]) of
{ok, ListenSocket} ->
spawn (fun () -> accept_client (ListenSocket) end );
_ -> {listen_error}
end.
accept_client (ListenSocket) ->
case gen_tcp:accept (ListenSocket) of
{ok, ClientSocket} ->
spawn (fun () -> accept_client (ListenSocket) end),
loop (ClientSocket);
_ -> {accept_error}
end.
do_recv(ClientSocket) ->
gen_tcp:recv(ClientSocket, 0),
do_recv(ClientSocket).
loop (ClientSocket) ->
%% get_tcp:recv (ClientSocket, Bin),
%% Reply = gen_tcp:recv(ClientSocket, 37),
%% inet:setopts(ClientSocket, [{active, once}]),
%%
%% io:format("Server (unpacked) ~p~n",[Reply]),
%% gen_tcp:send(ClientSocket,term_to_binary(Reply)),
%% loop(ClientSocket).
receive
{tcp, ClientSocket, Bin} ->
io:format ("Server received binary"),
io:format ("Server received binary = ~p ~n ", [Bin]),
Str = binary_to_term(Bin),
io:format("Server (unpacked) ~p~n",[Str]),
Reply = Str,
timer:sleep(5000),
io:format("Server replying = ~p~n",[Reply]),
gen_tcp:send(ClientSocket,term_to_binary(Reply)),
loop(ClientSocket);
{tcp_closed, ClientSocket} ->
io:format("Client closed~n")
end.
2014年08月01日 03点08分
1
%% @doc @todo Add description to erlTcpSer.
-module(erlTcpSer).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
%%{active, true} 主动模式, 客户端速度过快可能导致服务端内存不足而崩溃
%%{active, false} 被动模式, 在接收数据的地方调用 gen_tcp:recv ,可能等待一个具体的客户端而阻塞在那里
%%{active, once} 半阻塞模式, 主动仅针对一个消息,在控制进程发送完一个数据后,必须显示调用inet:setopts(Socket, [{active, once}])
%%重新激活以便接收下一个消息(在次之前处于阻塞状态),可实现流量控制防止服务器被过多消息淹没。
start () ->
case gen_tcp:listen (2345, [binary, {packet, 4}, {reuseaddr, true}, {active, once}]) of
{ok, ListenSocket} ->
spawn (fun () -> accept_client (ListenSocket) end );
_ -> {listen_error}
end.
accept_client (ListenSocket) ->
case gen_tcp:accept (ListenSocket) of
{ok, ClientSocket} ->
spawn (fun () -> accept_client (ListenSocket) end),
loop (ClientSocket);
_ -> {accept_error}
end.
do_recv(ClientSocket) ->
gen_tcp:recv(ClientSocket, 0),
do_recv(ClientSocket).
loop (ClientSocket) ->
%% get_tcp:recv (ClientSocket, Bin),
%% Reply = gen_tcp:recv(ClientSocket, 37),
%% inet:setopts(ClientSocket, [{active, once}]),
%%
%% io:format("Server (unpacked) ~p~n",[Reply]),
%% gen_tcp:send(ClientSocket,term_to_binary(Reply)),
%% loop(ClientSocket).
receive
{tcp, ClientSocket, Bin} ->
io:format ("Server received binary"),
io:format ("Server received binary = ~p ~n ", [Bin]),
Str = binary_to_term(Bin),
io:format("Server (unpacked) ~p~n",[Str]),
Reply = Str,
timer:sleep(5000),
io:format("Server replying = ~p~n",[Reply]),
gen_tcp:send(ClientSocket,term_to_binary(Reply)),
loop(ClientSocket);
{tcp_closed, ClientSocket} ->
io:format("Client closed~n")
end.