2016年12月8日木曜日

ElixirでTCP Echo server

ElixirTCP Echo serverです。全然わかっていませんが、エコーが返ってくる楽しさはわかりました(笑)。

/lib/kv_server.ex
defmodule KVServer do
  def accept(port) do
    # The options below mean:
    #
    # 1. `:binary` - receives data as binaries (instead of lists)
    # 2. `packet: :line` - receives data line by line
    # 3. `active: false` - block on `:gen_tcp.recv/2` until data is available
    #
    {: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)
    loop_acceptor(socket)
  end

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

    serve(client)
  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

サーバーを起動。telnetの接続を切ると、エラーで終了。
$ iex -S mix

iex(1)> KVServer.accept(4040)
Accepting connections on port 4040

** (MatchError) no match of right hand side value: {:error, :closed}
    (kv) lib/kv_server.ex:48: KVServer.read_line/1
    (kv) lib/kv_server.ex:41: KVServer.serve/1
    (kv) lib/kv_server.ex:35: KVServer.loop_acceptor/1

4040ポートにtelnet接続。任意にタイプすると、エコーが返ってくる。
$ telnet 127.0.0.1 4040
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Hello
Hello
World
World
Are you there?
Are you there?
^]
telnet> quit
Connection closed.

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

0 件のコメント:

コメントを投稿