我把它改了改,其实完全不一样,就是中间人的协议类似。
这样我觉得用起来舒服些。
-module(mm). -compile(export_all). client_start(Address,Port,Pid) -> spawn(fun() ->connect(Address,Port,Pid) end). connect(Address,Port,Pid) -> {ok,Socket}=gen_tcp:connect(Address,Port,[binary,{packet,4}]), loop(Socket,Pid). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% server_start(Port,Pid) -> spawn(fun() ->start_parallel_server(Port,Pid) end), ok. start_parallel_server(Port,Pid) -> link(Pid), %% Pid死的时候,listen也得死 {ok,Listen}=gen_tcp:listen(Port,[binary,{reuseaddr,true},{packet,4},{active,true}]), spawn(fun()->par_connect(Listen,Pid) end), %% just waiting receive after infinity -> true end. par_connect(Listen,Pid) -> case gen_tcp:accept(Listen) of {ok,Socket} -> spawn(fun()->par_connect(Listen,Pid) end),%% 启动一个新进程来accept连接,当前进程处理接受的socket link(Pid), %% Pid死的时候,mm也得死(当前进程变成了mm) loop(Socket,Pid); {error,closed} -> io:format("Listenning accept socket error,and was closed!~n") end. loop(Socket,Pid) -> receive {tcp,Socket,Data} -> Term=binary_to_term(Data), Pid ! {mm,self(),Term}, loop(Socket,Pid); {tcp_closed,Socket} -> Pid !{mm_closed,self()}; {send,Term} -> gen_tcp:send(Socket,term_to_binary(Term)), loop(Socket,Pid); close -> %% when client or server exit,use it,gen a tcp_closed at another point gen_tcp:close(Socket) end.