0

現在、 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).
4

1 に答える 1