Skip to content

Instantly share code, notes, and snippets.

@Jxck
Created January 24, 2013 16:32
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Jxck/4624554 to your computer and use it in GitHub Desktop.
Save Jxck/4624554 to your computer and use it in GitHub Desktop.
Socket.IO sample for Node.js_jp ML
node_modules
<!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>
{
"dependencies": {
"socket.io": "0.9.13"
}
}
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();
@Jxck
Copy link
Author

Jxck commented Jan 24, 2013

npm install で socket.io を入れて(@0.9.13)
サーバを起動して、 http://localhost:3000/client にアクセスすると、
通知を確認するページが出ます。

その状態で別のタブを開いて、そこにメールにあったような

http://localhost:3000/hoge?1=a&2=B

みたいなURL を入れて下さい。
適当に処理した結果が Socket.IO で飛んできて /client に表示されます。

あとは、サンプルから想像してやりました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment