Created
January 24, 2013 16:32
-
-
Save Jxck/4624554 to your computer and use it in GitHub Desktop.
Socket.IO sample for Node.js_jp ML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
node_modules |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Standalone.sample</title> | |
<script src="http://localhost:3000/socket.io/socket.io.js"></script> | |
<script type="text/javascript"> | |
var appname = io.connect('http://localhost:3000/appname'); | |
appname.on('available_channel', function(channels) { | |
console.log('channels', channels); | |
appname.emit('join', channels.pop()); | |
setTimeout(function() { // chat 付き? | |
appname.emit('post', 'hello!!'); | |
}, 1000); | |
}); | |
appname.on('user:message', function (query) { | |
console.log(query); | |
document.getElementById('query').innerText = query['1'] + ' & ' + query['2']; | |
}); | |
</script> | |
</head> | |
<body> | |
<h1>Alert From Batch</h1> | |
<dl> | |
<dt>query</dt> | |
<dd id="query"></dd> | |
</dl> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"dependencies": { | |
"socket.io": "0.9.13" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
log = console.log; | |
var http = require('http') | |
, url = require('url') | |
, fs = require('fs'); | |
// まず index.html を同期で読み込んでおきます。 | |
// こういうふうに事前(サーバの起動時に一回だけ) 先にやっておきたい | |
// 処理などがある場合は、別に同期でやったっていいんですよ。 | |
// もちろんうまくコールバックを渡したり、 Stream を pipe することもできます。 | |
var html = fs.readFileSync('index.html', 'utf-8'); | |
function start(route, handle) { | |
// listener を書きます。 | |
// ここでは http://localhost:3000/client が通知を見るクライアント | |
// それ + favicon 以外をバッチの情報としています。 | |
function onRequest(req, res) { | |
// するなら先に、でも utf8 はデフォルトなのでやらなくてもいい | |
req.setEncoding('utf8'); | |
var _url = req.url; | |
if (_url === '/client') { | |
// クライアント(通知を受け取りたい人) には | |
// html を返して終わります。 | |
return res.end(html); | |
} | |
if (_url === '/favicon.ico') { | |
// 適当に返して下さい。 | |
return; | |
} | |
// http://localhost:3000/hoge?1=a&2=B | |
// にアクセスされた場合。 | |
// パースします。一回でいいです。 | |
var parsedURL = url.parse(_url, true, true); | |
log(parsedURL); | |
// こんな感じ | |
//{ search: '?1=a&2=B', | |
// query: { '1': 'a', '2': 'B' }, | |
// pathname: '/hoge', | |
// path: '/hoge?1=a&2=B', | |
// href: '/hoge?1=a&2=B' } | |
// 送るのは query だけでいい? | |
var query = parsedURL.query; | |
// query 情報を送ります。 | |
sendBatchInfo('Appname', query); | |
// とりあえず、結果を返しておきます。 | |
// オブジェクトなので JSON 文字列に | |
res.end(JSON.stringify(parsedURL.query)); | |
} | |
// リスナを登録 | |
var server = http.createServer(onRequest); | |
// socket.io サーバは、上記のサーバに乗っかります。 | |
var io = require('socket.io').listen(server); | |
var archiveMessages = {}; // ? | |
var channels = ['Appname']; | |
var appname = io.of('/appname'); | |
// 送るための関数 | |
// ここでの appname はクロージャ | |
// appname に join してるクライアントに送られる。 | |
function sendBatchInfo(channelId, data) { | |
appname.in(channelId).json.emit('user:message', data); | |
} | |
appname.on('connection', function(socket) { | |
log('connected: %s', socket.id); | |
// push available channel list | |
socket.emit('available_channel', channels); | |
socket.on('join', function(channelId) { // channelId だけでよくない? | |
log('%s joined channel: %s', socket.id, channelId); | |
socket.join(channelId); | |
socket.set('channelId', channelId); // ここだけ channel_id ? | |
}); | |
socket.on('post', function(message) { | |
socket.get('channelId', function(err, channelId) { | |
console.log(' %s says<%s channel>: %s', socket.id, channelId, message); | |
}); | |
}); | |
socket.on('disconnect', function(){ | |
console.log('%s disconnected', socket.id); | |
socket.get('channelId', function(channelId){ | |
socket.leave(channelId); | |
}); | |
}); | |
}); | |
// サーバを listen します。 | |
server.listen(3000); | |
console.log('Serevr has sterted.'); | |
} | |
exports.start = start; | |
// test | |
start(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
npm install で socket.io を入れて(@0.9.13)
サーバを起動して、 http://localhost:3000/client にアクセスすると、
通知を確認するページが出ます。
その状態で別のタブを開いて、そこにメールにあったような
http://localhost:3000/hoge?1=a&2=B
みたいなURL を入れて下さい。
適当に処理した結果が Socket.IO で飛んできて /client に表示されます。
あとは、サンプルから想像してやりました。