LoginSignup
8
5

More than 5 years have passed since last update.

ElixirでWebSocketを使ってみる

Posted at

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

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5