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 モジュール使うより楽そう