udp_example.erl:
-module(udp_example).
-compile(export_all).
start_server() ->
spawn(fun() -> server(4000) end).
server(Port) ->
{ok, Socket} = gen_udp:open(Port, [binary]),
io:format("server start at ~p~n",[Port]),
loop(Socket).
loop(Socket) ->
receive
{udp, Socket, Host, Port, Bin} = Msg ->
io:format("server received:~p~n", [Msg]),
N = binary_to_term(Bin),
Fac = fac(N),
gen_udp:send(Socket, Host, Port, term_to_binary(Fac)),
loop(Socket)
end.
fac(0) -> 1;
fac(N) -> N*fac(N-1).
client(N) ->
{ok, Socket} = gen_udp:open(0, [binary]),
io:format("client open at:~p~n", [Socket]),
ok = gen_udp:send(Socket, "localhost", 4000,term_to_binary(N)),
Value = receive
{udp, Socket, _, _,Bin} = Msg ->
io:format("client received:~p~n",[Msg]),
binary_to_term(Bin)
after 2000 ->
0
end,
gen_udp:close(Socket),
Value.
1.udp是面向无连接的,所以只需要一个连接对象,就是一个socket。
2.udp是一次传一个包的,所以无需像TCP那样协商好一次的包是多大。
3.若包过大,推荐用TCP