LoginSignup
2

More than 5 years have passed since last update.

Node.jsのSocket.ioでサーバとクライアントが繋がるまで待機させる

Posted at

サーバとクライアントが接続するまで処理を待機

Node.jsのSocket.ioを使ってサーバとクライアントを繋げたんですが、接続が完了するまでに微妙に時間がかかってしまい、接続する前にエミットしたデータが取得できないという状況に陥ったので、繋がるまで待機させた時のメモ。

サーバー側

expressを使ったのでbin/www上で接続する。サーバ側はこんな感じ。

./bin/www
#!/usr/bin/env node
var debug = require('debug')('WillDo')
  , app = require('../app')
  , http = require('http');

exports.connected = false;

app.set('port', process.env.PORT || 3000);
var server = app.listen( app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port );
});

// Websocket
var io = require('socket.io').listen(server);

io.sockets.on('connection', function(socket) {
  console.log('サーバとクライアントつながりましたb');
  exports.connected = true;  // 接続したらtrueに

  socket.on('disconnect', function() {
    console.log('途切れました');
  });
});

exports.connected = false;
と接続完了したかを示す変数connectedを外部から取得できるようにモジュール化。connectionで接続完了したらしっかりとtrueにしておく。

var www = require('./bin/www');
var async = require('async');

// socketがつながるまでループする。
async.until(function(){ return www.connected; }, function(callback) {
    // 500ms待ってまだ繋がってなかったらもう一度500ms待つ。。。の繰り返し
    setTimeout(callback, 500);
    console.log('まだ繋がってないよ');
  }, function(err) {
    console.log('つながったよ');
  });

async#untilの仕様
これで外部のファイルからでも、繋がってるかを確認してから処理を行えるようになった。サーバー側、クライアント側だけなら

server.js
var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
  console.log('繋がったよ');
});

client.js
$(function(){
  var socket = io.connect();
  socket.on('connect', function() {
    console.log('繋がったよ');
  });
});

この中に処理をかけば、いい感じなんだろうけど、これ以外の外部ファイルで接続を確認してから処理を行いたかったので、以上の感じにしてみました。メモメモφ(・

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2