socket.io-go-emitter を試してみる

SocketIO のサーバー側が Node.js で以下のようなコード。

var io = require('socket.io').listen(9000);
var logger = require('./logger');
var redis = require('socket.io-redis');

io.adapter(redis({ host: 'localhost', port: 6379 }));

io.sockets.on('connection', function (socket) {
  logger.info('Connected from' + socket.id);

  socket.on('disconnect', function () {
    logger.info('disconnect');
  });
});

logger.info('Start Socket.IO server');
logger.info('Listening localhost:9000');

ブラウザ側。

var socket = io.connect('http://localhost:9000');
socket.on('msg', function (data) {
  console.log(data);
});

クライアント側の Golang なコード。

package main

import (
    "github.com/yosuke-furukawa/socket.io-go-emitter"
)

func main() {
    emitter, _ := SocketIO.NewEmitter(&SocketIO.EmitterOpts{
        Host: "127.0.0.1",
        Port: 6379,
    })
    emitter.Emit("msg", "I love you!!")
}

Golang を go run client.go として実行すると、ブラウザ側に I love you!! というメッセージが表示された。
てっきり一回 Node.js 側(上のコード方)で受信して、そこからブラウザにブロードキャストするもんかとおもってたけど、ちょっと動きが違って少しビックリした。


今までこういう事をやろうとすると、GitHub - maccman/juggernaut: [DEPRECATED] Realtime server push with node.js, WebSockets and Comet を使ってたけど、juggernaut は DEPRECATED になってたので、SocketIO 自体でサポートしてくれて良かった。


最初 Node.js の代わりに Golang の SocketIO 1.0 を使おうと思ったが、CORS はデフォルトでサポートしてないみたいなので、とりあえず Node.js で試した。
CORS が必要なのはメインで動作させるのが Flask で SocketIO は別ポートで動かしたいから。