Архитектура сервера для чтения стрима

121 views
Skip to first unread message

Denis Volokh

unread,
Mar 23, 2015, 11:55:39 AM3/23/15
to erlang-...@googlegroups.com
Привет,

У меня есть приложение, которое подключается к сокету, считывает данные и парсит их, все происходит в бесконечно цикле, вернее пока не прийдет определенный символ для закрытия соединения. 
Все это выполнено в no-OTP стиле. 

Теперь я начитался про gen_server и supervisor и хочу все переделать по-взрослому, но не могу понять где же будет крутиться мой цикл для чтения данных. 

Подскажите пожалуйста с архитектурой.

Sergey Pavlov

unread,
Mar 23, 2015, 5:00:05 PM3/23/15
to erlang-...@googlegroups.com
Вот небольшой например gen_server с UDP сокетом:

-record(state, {
 socket
}).


start_link
() ->
 gen_server
:start_link({local, ?MODULE}, ?MODULE, [], []).

init
([]) ->
 
%% open socket
 
{ok, Socket} = gen_udp:open(6970, [binary, {active, true}]),
 
{ok, #state{socket = Socket}}.


handle_call
(_Request, _From, State) ->
 
{reply, ok, State}.


handle_cast
(_Msg, State) ->
 
{noreply, State}.


handle_info
({udp, _Socket, _Addr, _Port, Data}, State) ->
 io
:format("Data: ~p~n", [Data]),
 
{noreply, State};


handle_info
(_Info, State) ->
 
{noreply, State}.


......




При получении сообщения будет вызываться handle_info({udp, _Socket, _Addr, _Port, Data}, State). Аналогично и с TCP сокетом.


понедельник, 23 марта 2015 г., 18:55:39 UTC+3 пользователь Denis Volokh написал:

Max Lapshin

unread,
Mar 23, 2015, 5:10:51 PM3/23/15
to erlang-...@googlegroups.com
Тут есть немного более глобальные вопросы: кто запустит этот ген-сервер и почему он решит это сделать?

Опция в конфиге или какой-то клик в веб-интерфейсе.

Может имеет смысл обсудить более полную задачу?

Denis Volokh

unread,
Mar 23, 2015, 10:10:14 PM3/23/15
to erlang-...@googlegroups.com
Приложение про запуске соединяется с сервером и "бесконечно" читает данные с сокета, со стороны пользователя никаких телодвижений.

Потом еще должно делать publish в redis, но это уже второй шаг.

Denis Volokh

unread,
Mar 23, 2015, 10:13:22 PM3/23/15
to erlang-...@googlegroups.com
Спасибо за пример, буду пробовать. 

Такой вопрос, у меня перед основным чтением будут еще два совего рода запроса через сокет: авторизация и subscribe. Все ответы будут приходить handle_info?

Денис Парыгин

unread,
Mar 24, 2015, 12:08:00 AM3/24/15
to erlang-...@googlegroups.com
Примеры это хорошо. Кто-то уже отправил.
Основная мысль - gen_server это и есть цикл. Отсюда и пляши 

понедельник, 23 марта 2015 г., 20:55:39 UTC+5 пользователь Denis Volokh написал:

Sergey Pavlov

unread,
Mar 24, 2015, 3:03:10 AM3/24/15
to erlang-...@googlegroups.com
Если сокет в активном режиме сообщения будут приходить тому процессу который контролирует сокет. Т.е. тот процесс который открыл сокет тот его и контролирует. Соответственно все сообщения из сокета будут валиться handle_info.

When UDP packets arrive at the opened port, if the socket is in an active mode the packets are delivered as messages to the controlling process:

{udp, Socket, IP, InPortNo, Packet}

А вообще есть отличная документация http://www.erlang.org/doc/  http://www.erlang.org/doc/man/gen_udp.html и т.д.

вторник, 24 марта 2015 г., 5:13:22 UTC+3 пользователь Denis Volokh написал:

Denis Volokh

unread,
Mar 25, 2015, 6:36:36 AM3/25/15
to erlang-...@googlegroups.com
Спасибо, уже разобрался.
Reply all
Reply to author
Forward
0 new messages