Erlang TCP编程使用packet属性保证send和receive一一对应
当获取Socket时,指定packet属性,可以保证server端一次只接受一个request数据包。
测试结果:
指定{packet,4}
2> tcp_test:start_server().sleep start, loop 2 timessleep 1000, time: 1sleep 1000, time: 2received request message <<"erlang client sending message one">>received request message <<"erlang client sending message two">>received request message <<"erlang client sending message four">>received request message <<"erlang client sending message five">>received request message <<"erlang client sending message six">>received request message <<"erlang client sending message seven">>received request message <<"erlang client sending message eight">>socket closeok
2> tcp_test:start_server().sleep start, loop 2 timessleep 1000, time: 1sleep 1000, time: 2received request message <<"erlang client sending message oneerlang client sending message twoerlang client sending message fourerlang client sending message fiveerlang client sending message sixerlang client sending message sevenerlang client sending message eight">>socket closeok
-module(tcp_test). -export([start_server/0, client/0, accept/1]). start_server()-> {ok, ListenSocket}=gen_tcp:listen(9999,[binary,{active,false},{packet, 4}]), accept(ListenSocket). accept(ListenSocket)-> {ok,Socket} = gen_tcp:accept(ListenSocket), spawn(?MODULE, accept,[ListenSocket]),sleep(2, 1000), process_request(Socket). process_request(Socket)-> case gen_tcp:recv(Socket,0) of {ok,Binary}-> io:format("received request message ~p~n", [Binary]), gen_tcp:send(Socket, "process successful"), process_request(Socket); {error, closed}-> io:format("socket close ~n"); _Req-> io:format("receive ~p~n", [_Req]) end. client()-> {ok,Socket}=gen_tcp:connect({127,0,0,1},9999,[binary,{packet,4},{active,false}]), gen_tcp:send(Socket, "erlang client sending message one"), gen_tcp:send(Socket, "erlang client sending message two"),gen_tcp:send(Socket, "erlang client sending message four"),gen_tcp:send(Socket, "erlang client sending message five"),gen_tcp:send(Socket, "erlang client sending message six"),gen_tcp:send(Socket, "erlang client sending message seven"),gen_tcp:send(Socket, "erlang client sending message eight"),sleep(2, 1000), ok = gen_tcp:close(Socket).sleep(Count, Time)->io:format("sleep start, loop ~p times \n", [Count]),sleep(1, Count, Time).sleep(Start, Count, Time) ->receive after Time ->io:format("sleep ~p, time: ~p\n", [Time, Start]),if Start sleep(Start + 1, Count, Time);true -> okendend.