版权声明:@潘广宇博客, https://blog.csdn.net/panguangyuu/article/details/89211209
一、创建 tcpServer.erl
-module(tcpServer).
-export([start/0]).
start() ->
% 创建一个端口2345用于监听来自客户端的请求,{package, 4} 是信息表头用4字节表示长度,需要与客户端一致
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]),
% 开始接受一个请求
{ok, Socket} = gen_tcp:accept(Listen),
% 接受请求成功后,关闭监听的端口不让其他请求处理
gen_tcp:close(Listen),
loop(Socket).
loop(Socket) ->
receive
% 接收到的来自客户端的信息
{tcp, Socket, Bin} ->
Receive = binary_to_list(Bin),
io:format("Server received Content = ~p~n", [Receive]),
Content = Receive ++ " Hello",
% 向客户端发送信息
gen_tcp:send(Socket, Content),
loop(Socket);
% 当客户端请求关闭tcp连接时
{tcp_closed, Socket} ->
io:format("Server socket closed~n")
end.
二、创建 tcpClient.erl
-module(tcpClient).
-export([start/1]).
start(Str) ->
{ok, Socket} = gen_tcp:connect("localhost", 2345, [binary, {packet, 4}]),
ok = gen_tcp:send(Socket, Str),
receive
{tcp, Socket, Bin} ->
Receive = binary_to_list(Bin),
io:format("Client received binary = ~p~n", [Receive]),
gen_tcp:close(Socket)
end.
三、同时编译,并在不同窗口调用
c(tcpServer).
c(tcpClient).
A 窗口:
tcpServer:start(). % 阻塞并监听来自客户端的请求
B窗口:
tcpClient:start("aaa"). % 发送aaa给服务端
可见A窗口得到响应:
Server received Content = "abcd"
Server socket closed
ok
B窗口得到响应:
Client received binary = "abcd Hello"
ok
我们就完成了简单的一个TCP服务器
四、gen_tcp:连接的相关socket参数