javascript,ruby間でwebsocket+msgpack使って通信

久々にまともなプログラミング系の記事です。✌('ω')✌

で、

クライアント <-> ( msgpack -> websocket -> msgpack ) <-> サーバー

のやり方メモ。

目的

なんとなく。

なんか色々とひっかかった点があったのでコードだけ上げておきます。

socket.io使えよ

ぐぅの音もでない

coffeescript使えよ

サンプルコードからいじって付け加えてってしただけなので

今度から使います

前書き

解説いるような複雑なものもないので、適当に動くコードだけペタってしときます。

見たら分かりますが今回の説明に必要なところしか書いてません。

msgpackはrpcは使用せずpack/unpackだけ使います。

javascript(クライアント)

websocket
HTML5API
msgpack
取ってくる。
https://github.com/uupaa/msgpack.js
rpcとか使わないのでmsgpack.codec.jsを使う。

クライアント

<!DOCTYPE HTML>
<html>
  <head>
    <script src="msgpack.codec.js"></script>
    <script>
    function WebSocketTest() {
      if (!("WebSocket" in window)) {
        // The browser doesn't support WebSocket
        alert("WebSocket NOT supported by your Browser!");
        return;
      }
      var ws = new WebSocket("ws://localhost:9998");
      ws.binaryType = 'arraybuffer';
      ws.onopen = function() {
        //送信処理
        var src = {'あいうえお':'かきくけこ', 'さしすせそ':'なにぬねの' }
        var binary = msgpack.pack(src);
        var arraybuffer = new Uint8Array(binary);
        ws.send(arraybuffer.buffer);
      };
      ws.onmessage = function (evt) {
        //受信処理
        var received_msg = evt.data;
        console.debug(msgpack.unpack(new Uint8Array(received_msg)));
      };
    }
    </script>
  </head>
  <body>
    <div id="sse">
      <a href="javascript:WebSocketTest()">Run WebSocket</a>
    </div>
  </body>
</html>

ruby(サーバー)

ここで使うem-websocketさんですが、そのままじゃバイナリ送れないので中身いじります。

送れない意味が全く分からないので送る方法あったら教えてください。

できるようになりました。

websocket
em-websocket(できるようになりましたが、gemで入るのはまだ古いので落としてくる。)
msgpack
gem install msgpack

em-websocket/lib/em-websocket/connection.rbの195行目あたり。

pongメソッドの下あたりにでもsend_binaryメソッド追加しておいてください。

(publicになってればどこでもいいですが。)

      def send_binary(data)
        if @handler
          @handler.send_frame(:binary, data)
        else
          raise WebSocketError, "Cannot sendbinary before onopen callback"
        end
      end

サーバー

# -*- encoding: utf-8 -*-

require_relative 'em-websocket/lib/em-websocket.rb'
require 'msgpack'

EventMachine::WebSocket.start(:host => "localhost", :port => 9998, :debug => true) do |ws|
  ws.onmessage { |msg|
    # 受信処理
    p MessagePack.unpack(msg)

    # 送信処理
    src = {'hoge'=>'fuga', 'piyo'=>'rofi'}
    binary = MessagePack.pack(src)
    ws.send_binary(binary)
  }
end

コメント
0件
トラックバック
1件
ブックマーク
0 users
kyubuns
kyubuns

たいていtwitterにいます。