直接上代码吧!
1.服务端:tcp_server.erl
- -module(tcp_server).
- -author('Jesse E.I. Farmer ').
- -export([listen/1]).
-
- -define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).
-
- % Call echo:listen(Port) to start the service.
- listen(Port) ->
- {ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
- accept(LSocket).
-
- % Wait for incoming connections and spawn the echo loop when we get one.
- accept(LSocket) ->
- {ok, Socket} = gen_tcp:accept(LSocket),
- spawn(fun() -> loop(Socket) end),
- accept(LSocket).
-
- % Echo back whatever data we receive on Socket.
- loop(Socket) ->
- case gen_tcp:recv(Socket, 0) of
- {ok, Data} ->
- io:format("recv ~p~n", [Data]),
- gen_tcp:send(Socket, Data),
- loop(Socket);
- {error, closed} ->
- ok
- end.
-module(tcp_server).
-author('Jesse E.I. Farmer ').
-export([listen/1]).
-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).
% Call echo:listen(Port) to start the service.
listen(Port) ->
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
accept(LSocket).
% Wait for incoming connections and spawn the echo loop when we get one.
accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> loop(Socket) end),
accept(LSocket).
% Echo back whatever data we receive on Socket.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
io:format("recv ~p~n", [Data]),
gen_tcp:send(Socket, Data),
loop(Socket);
{error, closed} ->
ok
end.
2.客户端:tcp_client.erl
- -module(tcp_client).
- -export([start/1, send_data/2, close/1]).
-
- start(Port) ->
- {ok, Socket} = gen_tcp:connect("127.0.0.1", Port, [binary, {packet, raw}, {active, true}, {reuseaddr, true}]),
- Socket.
-
-
- send_data(Socket, Data) when is_list(Data) orelse is_binary(Data) ->
- gen_tcp:send(Socket, Data),
- receive
- {tcp, Socket, Bin} ->
- io:format("recv ~p~n", [Bin]);
- {tcp_closed, Socket} ->
- io:format("remote server closed!~n")
- end.
-
- close(Socket) when is_port(Socket) ->
- gen_tcp:close(Socket).
-module(tcp_client).
-export([start/1, send_data/2, close/1]).
start(Port) ->
{ok, Socket} = gen_tcp:connect("127.0.0.1", Port, [binary, {packet, raw}, {active, true}, {reuseaddr, true}]),
Socket.
send_data(Socket, Data) when is_list(Data) orelse is_binary(Data) ->
gen_tcp:send(Socket, Data),
receive
{tcp, Socket, Bin} ->
io:format("recv ~p~n", [Bin]);
{tcp_closed, Socket} ->
io:format("remote server closed!~n")
end.
close(Socket) when is_port(Socket) ->
gen_tcp:close(Socket).
3.测试运行,需要开启两个终端,一个运行tcp_server,一个运行tcp_client,先运行tcp_server
- [root@centos-183 erlang-learn]# erl
- Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
-
- Eshell V5.9 (abort with ^G)
- 1> c(tcp_server).
- {ok,tcp_server}
- 2> tcp_server:listen(8080).
- recv <<"abc">>
[root@centos-183 erlang-learn]# erl
Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9 (abort with ^G)
1> c(tcp_server).
{ok,tcp_server}
2> tcp_server:listen(8080).
recv <<"abc">>
在tcp_client端
- [root@centos-183 erlang-learn]# erl
- Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
-
- Eshell V5.9 (abort with ^G)
- 1> c(tcp_client).
- {ok,tcp_client}
- 2> Socket=tcp_client:start(8080).
- #Port<0.2242>
- 3> tcp_client:send_data(Socket,<<"abc">>).
- recv <<"abc">>
- ok
- 4>
[root@centos-183 erlang-learn]# erl
Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9 (abort with ^G)
1> c(tcp_client).
{ok,tcp_client}
2> Socket=tcp_client:start(8080).
#Port<0.2242>
3> tcp_client:send_data(Socket,<<"abc">>).
recv <<"abc">>
ok
4>