esockd组件测试

第一次遇见esockd组件,在网上找了段时间,没有发现具体的使用方法,自己就做了一些测试,记录如下:

首先:结构如下

其中启动脚本为run.bat:

1 cd config/  
2 erl  -pa ../ebin/ -name shay@test -setcookie abc -boot start_sasl -s my_esockd start   

脚本启动 my_esockd:start

-module(my_esockd).

-export([start/0]).

start() ->
    esockd_test:start().

接着调用 esockd_test:start():

-module(esockd_test).

-behaviour(gen_server).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

%% ====================================================================
%% API functions
%% ====================================================================
-export([
         start/0,
         start_link/1
        ]
       ).

-define(TCP_OPTIONS, [
        binary,
        {packet, 2},
        %{buffer, 1024},
        {reuseaddr, true},
        {backlog, 512},
        {nodelay, false}]
).

-record(protocol, {
          conn
         }).

%% ====================================================================
%% External functions
%% ====================================================================

start() ->
    io:format("esockd_test has start~n", []),
    ok = esockd:start(),
    SockOpts = [
        {acceptors, 10},
        {max_clients, 10000},
        {sockopts, ?TCP_OPTIONS}
    ],
    MFArgs = {?MODULE, start_link, []},
    Ret = esockd:open(***, 8387, SockOpts, MFArgs),
    io:format("esockd Ret : ~p~n", [Ret]).

start_link(Conn) ->
    {ok, proc_lib:spawn_link(?MODULE, init, [Conn])}.

%% ====================================================================
init(Conn) ->
    %io:format("init logic_connection~n"),
    %{ok, Conn1} = esockd_connection:ack(Conn),
    Conn:setopts([{active, once}]),
    io:format("connection is OK~n", []),
    gen_server:enter_loop(?MODULE, [], #protocol{
        conn = Conn
    }).

%% handle_call/3
handle_call(Request, From, State) ->
    Reply =
        try
            do_call(Request, From, State)
        catch
            Err:Reason->
                io:format("Error:~p,Reason:~p\nstacktrace:~p",[Err,Reason,erlang:get_stacktrace()]),
                error
        end,
    {reply, Reply, State}.


%% handle_cast/2
%% ====================================================================
handle_cast(Msg, State) ->
    State1 =
        try
            do_cast(Msg,State)
        catch
            Err:Reason->
                io:format("Error:~p,Reason:~p\nstacktrace:~p",[Err,Reason,erlang:get_stacktrace()]),
                State
        end,
    {noreply, State1}.


%% handle_info/2
%% ====================================================================
handle_info(Info, State) ->
    State1 =
        try
            do_info(Info,State)
        catch
            Err:Reason->
                io:format("Error:~p,Reason:~p\nstacktrace:~p",[Err,Reason,erlang:get_stacktrace()]),
                State
        end,
    {noreply, State1}.

%% terminate/2
%% ====================================================================
terminate(_Reason, _State) ->
    io:format("terminate has used...~n", []),
    save(_State),
    ok.


%% code_change/3
%% ====================================================================
code_change(_OldVsn, State, _Extra) ->
    {ok, State}. 

%% ====================================================================
%% internal functions
%% ====================================================================

do_call(_Request, _From, _State)->
    io:format("handle_call has used...~n", []),
    ok.

do_cast(_Msg,State)->
    io:format("handle_cast has used...~n", []),
    State.

do_info(_Info,State)->
    io:format("handle_info has used...~n", []),
    State.

%% save db
save(_State) ->
    ok.

esockd:open(What, Port, SocketOpts, MFArgs) 通过端口开启侦听,每当有链接接入时就会调用MFArgs,既MFArgs = {?MODULE, start_link, []}

测试:

可以发现 esockd:open 只需要调用一次 每次有客户端连接的时候都会创建一个新的链接

posted @ 2017-05-16 16:46  Shay_黄  阅读(708)  评论(0编辑  收藏  举报