书中的例子,非常简单的浏览器,http server的客户端
http server
-module(socket_examples).
-export([nano_get_url/0,nano_get_url/1, start_nano_server/0, nano_client_eval/1]).
-import(lists, [reverse/1]).
nano_get_url() ->
nano_get_url("").
nano_get_url(Host) ->
{ok, Socket} = gen_tcp:connect(Host, 80, [binary, {packet, 0}]),
io:format("Socket is ~p~n~n", [Socket]),
ok = gen_tcp:send(Socket, "GET / HTTP/1.0\r\n\r\n"),
receive_data(Socket, []).
receive_data(Socket, SoFar) ->
receive
{tcp, Socket, Bin} ->
receive_data(Socket, [Bin|SoFar]);
{tcp_closed, Socket} ->
io:format("receive data is~n~n ~p~n~n~n~n ", [SoFar]),
B = list_to_binary(reverse(SoFar)),
%% B = lists:reverse(SoFar),
io:format("raw data sended is~n~n ~p~n~n~n~n", [B]),
BB = string:tokens(binary_to_list(B), "\r\n"),
io:format("string:~n~n ~p~n~n~n~n",[BB])
end.
start_nano_server() ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]),
io:format("-1 listen is:~p~n~n", [Listen]),
spawn(fun() -> looplisten(Listen) end).
looplisten(Listen) ->
io:format("----2 New process is:~p~n", [self()]),
{ok, Socket} = gen_tcp:accept(Listen),
spawn(fun() -> looplisten(Listen) end),
loop(Socket),
%%并发进程,但是如果真正并发下面代码会有问题,串行还可以正常运行,主要想看看进程是否消失!!
Lispid = self(),
io:format("-8 selfis~p~n",[Lispid]),
register(listenpid, Lispid),
io:format("-9 self is ~p,atom listenpid is ~p ~n~n~n", [self(), whereis(listenpid)]).
loop(Socket) ->
receive
{tcp, Socket, Bin} ->
io:format("-34 Server receive binary: ~p~n", [Bin]),
Str = binary_to_term(Bin),
io:format("-5 Server unpacked ~p~n", [Str]),
Reply = Str*Str,
io:format("-6 Server replying:~p~n", [Reply]),
gen_tcp:send(Socket, term_to_binary(Reply)),
loop(Socket);
{tcp_closed, Socket} ->
io:format("-7 Server socket ~p closed ~n", [Socket])
end.
nano_client_eval(Str) ->
{ok, Socket} = gen_tcp:connect("localhost", 2345, [binary, {packet, 4}]),
ok = gen_tcp:send(Socket, term_to_binary(Str)),
receive
{tcp, Socket, Bin} ->
io:format("Client receive binary : ~p~n", [Bin]),
Val = binary_to_term(Bin),
io:format("client result is ~p~n", [Val]),
gen_tcp:close(Socket)
end.
阅读(225) | 评论(0) | 转发(0) |