Help us understand the problem. What is going on with this article?

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

tamanugi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away