/jaerlang-code/code/socket_examples.erl
https://github.com/killme2008/erlib · Erlang · 94 lines · 69 code · 17 blank · 8 comment · 0 complexity · ed120282e3d8b216b31ac63b4a8cc615 MD5 · raw file
- %% ---
- %% Excerpted from "Programming Erlang",
- %% published by The Pragmatic Bookshelf.
- %% Copyrights apply to this code. It may not be used to create training material,
- %% courses, books, articles, and the like. Contact us if you are in doubt.
- %% We make no guarantees that this code is fit for any purpose.
- %% Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
- %%---
- -module(socket_examples).
- -compile(export_all).
- -import(lists, [reverse/1]).
- nano_get_url() ->
- nano_get_url("www.google.com").
- nano_get_url(Host) ->
- {ok,Socket} = gen_tcp:connect(Host,80,[binary, {packet, 0}]), %% (1)
- ok = gen_tcp:send(Socket, "GET / HTTP/1.0\r\n\r\n"), %% (2)
- receive_data(Socket, []).
- receive_data(Socket, SoFar) ->
- receive
- {tcp,Socket,Bin} -> %% (3)
- receive_data(Socket, [Bin|SoFar]);
- {tcp_closed,Socket} -> %% (4)
- list_to_binary(reverse(SoFar)) %% (5)
- 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 received binary = ~p~n",[Bin]),
- Val = binary_to_term(Bin),
- io:format("Client result = ~p~n",[Val]),
- gen_tcp:close(Socket)
- end.
- start_nano_server() ->
- {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, %% (6)
- {reuseaddr, true},
- {active, true}]),
- {ok, Socket} = gen_tcp:accept(Listen), %% (7)
- gen_tcp:close(Listen), %% (8)
- loop(Socket).
- loop(Socket) ->
- receive
- {tcp, Socket, Bin} ->
- io:format("Server received binary = ~p~n",[Bin]),
- Str = binary_to_term(Bin), %% (9)
- io:format("Server (unpacked) ~p~n",[Str]),
- Reply = lib_misc:string2value(Str), %% (10)
- io:format("Server replying = ~p~n",[Reply]),
- gen_tcp:send(Socket, term_to_binary(Reply)), %% (11)
- loop(Socket);
- {tcp_closed, Socket} ->
- io:format("Server socket closed~n")
- end.
- error_test() ->
- spawn(fun() -> error_test_server() end),
- lib_misc:sleep(2000),
- {ok,Socket} = gen_tcp:connect("localhost",4321,[binary, {packet, 2}]),
- io:format("connected to:~p~n",[Socket]),
- gen_tcp:send(Socket, <<"123">>),
- receive
- Any ->
- io:format("Any=~p~n",[Any])
- end.
- error_test_server() ->
- {ok, Listen} = gen_tcp:listen(4321, [binary,{packet,2}]),
- {ok, Socket} = gen_tcp:accept(Listen),
- error_test_server_loop(Socket).
- error_test_server_loop(Socket) ->
- receive
- {tcp, Socket, Data} ->
- io:format("received:~p~n",[Data]),
- atom_to_list(Data),
- error_test_server_loop(Socket)
- end.