美文网首页
Erlang使用SSL

Erlang使用SSL

作者: 简单点的笨演员 | 来源:发表于2021-02-22 14:09 被阅读0次

首先要一个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"
.....

相关文章

网友评论

      本文标题:Erlang使用SSL

      本文链接:https://www.haomeiwen.com/subject/mgbhfltx.html