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 は別ポートで動かしたいから。