读书人

Erlang TCP编程施用packet属性保证sen

发布时间: 2012-10-20 14:12:47 作者: rapoo

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




指定{packet,0}

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.


本博客由广州礼邦办公家具有限公司赞助。

读书人网 >编程

热点推荐