首先要一个SSL证书,參考这篇文章创建。创建后放到与代码同一个目录。
编写server.erl代码:
-module(server).
-export([start/0, accept/1]).
start() ->
ssl:start(),
server(8000).
server(Port) ->
{ok, LSocket} = ssl:listen(Port, [{certfile,"certificate.pem"}, {keyfile, "key.pem"}, {reuseaddr, true}]),
spawn(fun() -> accept(LSocket) end).
accept(LSocket) ->
{ok, Socket} = ssl:transport_accept(LSocket),
Pid = spawn(fun() ->
io:format("Connection accepted ~p~n", [Socket]),
ssl:ssl_accept(Socket),
loop(Socket)
end),
ssl:controlling_process(Socket, Pid),
accept(LSocket).
loop(Socket) ->
receive
{ssl,Sock, Data} ->
io:format("Got packet: ~p~n", [Data]),
ssl:send(Sock, Data),
loop(Sock);
{ssl_closed, Sock} ->
io:format("Closing socket: ~p~n", [Sock]);
Error ->
io:format("Error on socket: ~p~n", [Error])
after 10000 ->
ssl:close(Socket),
io:format("Timeout on socket: ~p~n", [Socket])
end.
编写client.erl代码:
-module(client).
-export([start/0]).
start() ->
ssl:start(),
{ok, Socket} = ssl:connect("localhost", 8000, [], 3000), % 3秒超时
io:format("Client opened socket: ~p~n", [Socket]),
loop(Socket).
loop(Socket) ->
ok = ssl:send(Socket, "N"),
receive
{ssl,_Sock, Data} ->
io:format("Got packet: ~p~n", [Data]);
{ssl_closed, Sock} ->
io:format("Closing socket: ~p~n", [Sock])
after 1000 ->
ssl:close(Socket),
io:format("Timeout on socket: ~p~n", [Socket])
end,
timer:sleep(1000),
loop(Socket).
shell启动服务端测试:
$ erlc server.erl
$ erl
Eshell V8.3 (abort with ^G)
1> server:start().
<0.74.0>
2>
使用客户端连接:
$ erlc client.erl
$ erl
Eshell V8.3 (abort with ^G)
1> client:start().
Client opened socket: {sslsocket,
{gen_tcp,#Port<0.1121>,tls_connection,undefined},
<0.79.0>}
Got packet: "N"
Got packet: "N"
Got packet: "N"
Got packet: "N"
Got packet: "N"
Got packet: "N"
.....
网友评论