KOBA789 です。 指摘したい点はたくさんありますが、まず1点だけ失礼します。 なぜ、わざわざ setTimeout による時間差によって実行順序を指定するということをしているのでしょうか。 素直に考えて、コールバックをネストさせることで対応するのが最善だと思うのですが、そうしなかった理由を教えていただきたいです。その理由知ることでより踏み込んだアドバイスができると考えています。
2013年1月24日 11:03 matton <[email protected]>: > お世話になります。 松尾と申します。 > > 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; > ------------------------------------------------------------------------------------------------ > > > > -- > > > --
