本來打算在window下在quick里面嵌入protobuf,發(fā)現(xiàn)毛病很多。研究1天都沒弄好。只能休息下弄下erlang服務(wù)端,先將服務(wù)端弄好再回頭嵌入protobuf到quick。
在window下不能用rebar,只能自己管理。erlang 是自己弱項(xiàng)。做個(gè)簡單的服務(wù)端基于OTP框架,是1個(gè)標(biāo)準(zhǔn)的實(shí)現(xiàn),以后再漸漸擴(kuò)大吧。
(1).建立好目錄doc,ebin,include,priv,src,testClient
(2).在ebin目錄下加入元數(shù)據(jù)server.app,用來啟動(dòng)application
(3).在src下建立bz_server_sup.erl,bz_server_app.erl,bz_server.erl 3個(gè)文件。
bz_server_app.erl 用來打包程序,啟動(dòng),關(guān)閉。只提供start/2,stop/1兩個(gè)函數(shù)
start(_StartType,_StartArgs) ->
{ok,LSock} = gen_tcp:listen(?DEFAULT_PORT,?TCP_OPTIONS),
case bz_server_sup:start_link(LSock) of
{ok,Pid} ->
bz_server_sup:start_child(),
{ok,Pid};
Other ->
io:format("bz_server_app Listen error : ~p !",[Other]),
{error,Other}
end.
stop(_State) ->
ok.
bz_server_sup.erl 監(jiān)聽者頂級(jí)監(jiān)聽,規(guī)定了子監(jiān)聽的啟動(dòng)
start_link(LSock) ->
supervisor:start_link({"127.0.0.1",?SERVER},?MODULE,[LSock]).
start_child() ->
supervisor:start_child(?SERVER,[]).
%%Supervisor callback
init([LSock]) ->
Server = {bz_server, {bz_server, start_link, [LSock]},
temporary, brutal_kill, worker, [bz_server]},
Children = [Server],
RestartStrategy = {simple_one_for_one, 0, 1},
{ok, {RestartStrategy, Children}}.
bz_server.erl. gen_server ,負(fù)責(zé)等待連接以后的多數(shù)實(shí)現(xiàn)就在這里實(shí)現(xiàn)。以后打算就在這里實(shí)現(xiàn)重客戶端發(fā)送過來的消息在分發(fā)下去。
%%-------------private---------------------
accept(ListenSocket) ->
case gen_tcp:accept(ListenSocket) of
{ok,Socket} ->
io:format("<<<<<<<<<<start connect>>>>>>>>>
"),
io:format("accept client socket : ~p
",[Socket]),
gen_tcp:controlling_process(Socket, self()),
bz_server_sup:start_child();
{error,Reason} ->
io:format("accept error reason : ~p
",[Reason]),
accept(ListenSocket);
_Res ->
io:format("accept unexpected result : ~p
",[_Res]),
accept(ListenSocket)
end.
handle_info({tcp,Socket,RawData},State) -> %%數(shù)據(jù)收取分發(fā)
io:format("Socket :~p , RawData : ~p
",[Socket,RawData]),
%%gen_tcp:send(Socket, "erlang server bin"),
{noreply,RawData};