socket.ioの通信はクライアントがトリガーになっているが、
サーバ側から任意のタイミング、特定のユーザーへメッセージを送信したいことがある。
(iOS,AndroidでいうPUSH通知のようなもの)
それを実現するのがsocket.io-emitterというモジュール。
https://github.com/automattic/socket.io-emitter
インストール
# npm install --save socket.io-emitter
PUSH用のコードは以下になる。
今回は emit.js としておく。
名前空間、ルーム、ユーザーそれぞれにPUSHできる。
//emit.js var emitter = require('socket.io-emitter')({ host: '127.0.0.1', port: 6379 }); //全接続へ emitter.emit('other_process', 'broadcasting'); //名前空間へ emitter.of('/chat').emit('other_process', 'broadcasting to namespace'); //特定のルームへ emitter.of('/chat').to('room1').emit('other_process', 'broadcasting to room1'); //特定ユーザー(socketID)へ var socketId = 'vikCSpoMsVDmsJFGAAAB'; emitter.of('/chat').to(socketId).emit('other_process', 'private message');
上記のメッセージを受け取るのはクライアントになるので、
other_process をハンドリングしておく。
$(function(){ var chatRoom = io('http://192.168.33.10:3000/chat', { transports: [ 'websocket' ] }); chatRoom.on('other_process', function(msg){ console.log(msg); }); });
今回は既存のアプリケーションプロセスとして、expressを起動する。
# node www/bin
起動を確認したら、emit.jsを実行する。
# node emit.js
すると、emit.js からのPUSHがクライアントに届く。