Erlang socket.io сервер с супервизором
В настоящее время я пытаюсь создать простой чат-сервер с socket.io-erlang. Я только начал изучать Erlang, поэтому у меня возникли проблемы с адаптацией их демонстрации, чтобы она работала с модулями. Надеюсь, вы сможете мне помочь, вот что у меня есть до сих пор. У него не должно быть никаких функций, на этот раз я только хочу, чтобы он работал (у меня есть несколько отчетов о сбоях после запуска, вы можете прочитать их, если хотите).
Приложение
-module(echat_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
echat_sup:start_link().
stop(_State) ->
ok.
Руководитель
-module(echat_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
application:start(sasl),
application:start(gproc),
application:start(misultin),
application:start(socketio),
{ok, Pid} = socketio_listener:start([{http_port, 7878}, {default_http_handler,echat_http_handler}]),
EventManager = socketio_listener:event_manager(Pid),
ok = gen_event:add_handler(EventManager, echat_socketio_handler,[]),
receive _ ->
io:format("sub received something"),
{ok, {
{one_for_one, 5, 10},
[]
}}
end.
Обработчик событий Socket.IO
-module(echat_socketio_handler).
-behaviour(gen_event).
-include_lib("socketio/include/socketio.hrl").
-export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]).
init([]) ->
{ok, undefined}.
handle_event({client, Pid}, State) ->
io:format("Connected: ~p~n",[Pid]),
EventManager = socketio_client:event_manager(Pid),
ok = gen_event:add_handler(EventManager, ?MODULE,[]),
{ok, State};
handle_event({disconnect, Pid}, State) ->
io:format("Disconnected: ~p~n",[Pid]),
{ok, State};
handle_event({message, Client, Msg=#msg{content=Content}}, State) ->
io:format("Got a message: ~p from ~p~n",[Msg, Client]),
socketio_client:send(Client, #msg{ content = "hello!" }),
socketio_client:send(Client, #msg{ content = [{<<"echo">>, Content}], json = true}),
{ok, State};
handle_event(_E, State) ->
{ok, State}.
handle_call(_, State) ->
{reply, ok, State}.
handle_info(_, State) ->
{ok, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
Обработчик запросов HTTP
-module(echat_http_handler).
-export([handle_request/3]).
handle_request(_Method, _Path, Req) ->
Req:respond(200).
1 ответ
Только несколько вещей, нет конкретного ответа на ваш вопрос.
Во-первых, обычно вы запускаете зависимости перед запуском приложения, а не с инициализации какого-либо супервизора.
По поводу ошибок:
{error, {{noproc, {gen_server, call, [socketio_listener_sup_sup, {start_child, [[{http_port, 7878}, {default_http_handler, echat_http_handler}]]}, бесконечность]}}, {echat_app,start,[normal,[]]}}}
Это первое, это означает, что код пытался вызвать gen_server с именем 'socketio_listener_sup_sup', но этот процесс не существовал. Учитывая его название, я думаю, это то, что должно запускаться самим приложением socket.io-erlang, так что, возможно, оно по какой-то причине не запускается правильно. Вы можете легко это проверить, проверив результаты:
ok = application:start(sasl),
ok = application:start(gproc),
ok = application:start(misultin),
ok = application:start(socketio),