2016年12月9日金曜日

ElixirでTCP Echo server(Task.Supervisor版)

ElixirTCP Echo server(Task.Supervisor版)です。Supervisorで監視するようにすると、複数のtelnetで接続し、それぞれコネクションを切ってクラッシュさせても、サービスは起動したままになります。わからないながらも面白い。Supervisorの働きがよくわかります。

/lib/kv.ex
defmodule KV do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      supervisor(Task.Supervisor, [[name: KVServer.TaskSupervisor]]),
      worker(Task, [KVServer, :accept, [4040]])
    ]

    opts = [strategy: :one_for_one, name: KVServer.Supervisor]
    Supervisor.start_link(children, opts)
  end
end
/lib/kv_server.ex
defmodule KVServer do
  def accept(port) do
    {:ok, socket} = :gen_tcp.listen(port,
                      [:binary, packet: :line, active: false])
    IO.puts "Accepting connections on port #{port}"
    loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    #serve(client)
    #Task.start_link(fn -> serve(client) end)
    Task.Supervisor.start_child(KVServer.TaskSupervisor, fn -> serve(client) end)
    loop_acceptor(socket)
  end

  defp serve(socket) do
    socket
    |> read_line()
    |> write_line(socket)

    serve(socket)
  end

  defp read_line(socket) do
    {:ok, data} = :gen_tcp.recv(socket, 0)
    data
  end

  defp write_line(line, socket) do
    :gen_tcp.send(socket, line)
  end
end

参考サイト
ElixirでTaskを使ってEchoServerを動かす( ヽ(´・肉・`)ノログさん)
Task and gen_tcp - Elixir

0 件のコメント:

コメントを投稿