お世話になります。 松尾と申します。 node.jsにて下記の様な仕組みを作成しております。
現在、バッチプログラム(vs.net C#)にてDB監視を行い、結果をクライアントに通知する仕組みを作成しています。 監視バッチ→node.js→ios/android として、node.js→ios/androidはリアルタイム通知の為、soket-ioを使用しています。(※ちなみに監視バッチ→node.jsはwebsocketが使用できない為、URLにてデータを渡しています。http://xxx?1=a&2=B) node.js内でアクセスされたURL引数をJSONに変換してクライアントへsocket-ioにて一斉配信しています。 とりあえず動いてはいるのですが、URLで受け取ったデータをsocket-ioにて配信する際、一度、自分自身のsocket-ioにconnectしてsocketにセットしています。 connectが非同期となる為setTimeoutを利用している為、サーバの負荷次第ではconnect処理(serversocket1)を配信処理(serversocket2)が追い越してしまうと考えています。 何か良い制御方法は無いのでしょうか? よろしくお願いします。 環境 windows2003 sp2 node v0.8.17 メイン部分のソースです。 ------------------------------------------------------------------------------------------- var http = require("http"); var url = require("url"); var socketval = 0; function start(route,handle){ var query = ""; function onRequest(request,response){ var queryData = url.parse(request.url, true).query; var url_parts = url.parse(request.url,true); query = url.parse(request.url, true).query; var pathname = url.parse(request.url).pathname; if(socketval===0){ setTimeout(function(){serversocket1("Appname",query)},1); }; setTimeout(function(){serversocket2("Appname",query)},1000); request.setEncoding("utf8"); request.addListener("end",function(){ route(handle,pathname,response); }); } var server = http.createServer(onRequest).listen(8080); //console.log("Serevr has sterted."); // socket.io var io = require('socket.io').listen(server); var archiveMessages = {}; var channels = ['Appname']; var appname = io.of('/appname'); var socket = ""; var socket_c = ""; appname.on('connection', function(socketin){ console.log('connected: %s', socket.id); socket = socketin; // push available channel list socket.emit('available_channel', channels); socket.on('join', function(value){ console.log('%s joined channel: %s', socket.id, value.channelId); socket.join(value.channelId); }); socket.on('join_c', function(value){ console.log('clientjoin %s joined channel: %s', socket.id, value.channelId); socket.join(value.channelId); socket_c = socket; socketval=1; }); socket.on('post', function(message){ socket.get('channel_id', 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('channel_id', function(channelId){ socket.leave(channelId); }); }); }); var io_c = require('socket.io').client; var appname_c = ""; function serversocket1(channelId,data){ var appname_c_1 = io_c.connect('http://localhost:8080'); appname_c = appname_c_1.of('/appname'); appname_c.emit('join_c', { channelId: 'Appname' }); } function serversocket2(channelId,data){ socket_c.set('channel_id', channelId, function(){ socket_c.emit('posted', data); socket_c.broadcast.to(channelId).emit('user:message', data); }); } }; exports.start = start; ------------------------------------------------------------------------------------------------ --
