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 只需要调用一次 每次有客户端连接的时候都会创建一个新的链接