Posted at

ElixirでWebSocketを使ってみる

More than 1 year has passed since last update.

https://github.com/meh/elixir-socket を少し触ってみた

まずは プロジェクト作成&ライブラリインストール

$ mix new testing_websocket

$ mix deps.get
#mix.exsに {:socket, "~> 0.3"} を追加

次に サーバー側でlisten


サーバー側iex

$ iex -S mix

iex> server = Socket.Web.listen! 9000
iex> client = server |> Socket.Web.accept!

ここで一旦コネクションを待つので別窓でiex を立てる


クライアント側iex

iex> socket = Socket.Web.connect! "localhost", 9000


これでサーバー側iexの表示が変わる


サーバー側iex

iex> client = server |> Socket.Web.accept!

%Socket.Web{extensions: nil,
headers: %{"connection" => "Upgrade", "host" => "localhost:9000",
"sec-websocket-key" => "Zm9yayB0aGUgZG9uZ2xlcw==",
"sec-websocket-version" => "13", "upgrade" => "websocket"},
key: "Zm9yayB0aGUgZG9uZ2xlcw==", mask: nil, origin: nil, path: "/",
protocols: nil, socket: #Port<0.4797>, version: 13}

これで接続できたのかなと思ったらクライアント側は何にも起こらず。。。

どうやらサーバー側から繋がったことを教えてあげないといけないっぽい


サーバー側iex

iex>client |> Socket.Web.accept!



クライアント側iex

iex> socket = Socket.Web.connect! "localhost", 9000

%Socket.Web{extensions: nil, headers: %{}, key: "Zm9yayB0aGUgZG9uZ2xlcw==",
mask: true, origin: nil, path: "/", protocols: nil, socket: #Port<0.4753>,
version: 13}

次はメッセージを受け取ってみる

サーバー側で待ち受け


サーバー側iex

iex> client |> Socket.Web.recv!


クライアント側から送信


クライアント側iex

socket |> Socket.Web.send!({:text, "test"})



サーバー側iex

iex> client |> Socket.Web.recv!

{:text, "test"}

素の :gen_tcp モジュール使うより楽そう