直接上代码吧!
1.服务端:tcp_server.erl
-module(tcp_server).
-author('Jesse E.I. Farmer <jesse@20bits.com>').
-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).
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">>
在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>
本文详细介绍了如何使用Erlang编写一个简单的TCP服务器和客户端,包括服务器端监听、接受连接和回显数据,以及客户端连接、发送和接收数据的功能。通过在两个独立终端中运行示例代码,演示了客户端与服务器之间的基本通信流程。
1886

被折叠的 条评论
为什么被折叠?



