2012-12-19 3 views
3

Я пытаюсь установить соединение с веб-сокетом. Но я не могу заставить его ждать, пока сервер не запустится. Всякий раз, когда я запускаю свой клиент без запуска сервера, я попал в событие с ошибкой. Что мне нужно сделать, чтобы заставить моего клиента ждать, пока сервер не запустится?Как заставить websocket ждать в Node.js

Мой клиент в Node.js

var WebSocket = require('ws'); 
var ws = new WebSocket('ws://localhost:90'); 


ws.on('open', function() { 
    console.log('Client 1 Started'); 
}); 

ws.on('message', function(message) { 
    console.log(message); 
}); 

ws.on('error', function(err) { 
    console.log('Client Error :- ',err.code); 
}); 

ws.on('close', function() { 
console.log('Connection terminated..Closing Client 1'); 
}); 

ответ

-1

Его работа для меня ... Теперь клиент может ждать до сих пор сервера получить Start ...

var WebSocket = require('ws'); 
var ws = new WebSocket('ws://localhost:90'); 

ws.on('error', function(err) { 
    console.log('Waiting For Connection..'); 
    setTimeout(poll, 1000); 
}); 


var poll = function() { 

ws = new WebSocket('ws://localhost:90'); 

ws.on('open', function() { 
    console.log('Client 1 Started'); 
}); 

ws.on('message', function(message) { 
    console.log(message); 
}); 

ws.on('error', function(err) { 
    // Check error code? Maybe put it in close event? 
    setTimeout(poll, 1000); 
}); 

ws.on('close', function() { 
    console.log('Connection terminated..Closing Client 1'); 
}); 
} 
+0

@ Поврежденный ответ работает, просто нужно вызвать 'poll()' в конце. Нет необходимости в дополнительном коде здесь. – RozzA

1

Перевод с французского на английский язык только для вас^^ небольшая тема для TChat на Node.js (извините за комментарий на французском) от http://www.atinux.fr/2011/08/28/tutoriel-socket-io-debutant/

Серверная сторона

var io = require('socket.io'); 

Он должен затем, после создания сервера HTTP с Нет де-JS, Socket.IO слушать его:

io = io.listen(app); 

стороне клиента

Вам нужно вставить ссылку на библиотеку в заголовке. Html:

<script type="text/javascript" src="/socket.io/socket.io.js"> 

Тогда у вас есть новое подключение к серверу:

<script type="text/javascript"> 
    var socket = io.connect(); 
</script> 

Evenement

Чтобы создать событие, просто сделать:

socket.on('monEvenement', maFonction); 

Как вы можете видеть, что переменная сокета еще не объявлена на стороне сервера, на самом деле, он должен восстановиться благодаря событию "соединение"

io.sockets.on('connection', function (socket) { 

}); 

Вызов Evenement

socket.emit('monEvenement', mesDonnees); 

Другое вещательного

socket.broadcast.emit('monEvenement', mesDonnees); 

сторона Пример сервера

var html = require('fs').readFileSync(__dirname+'/app.html'); 
var app = require('http').createServer(function(req, res){ res.end(html); }); 
app.listen(8080); 
var io = require("socket.io"); 
var io = io.listen(app); 
io.sockets.on('connection', function (socket) { 
    socket.emit('faitUneAlerte'); 
}); 

Exemple стороне клиента

<script type="text/javascript" src="/socket.io/socket.io.js"></script> 
<script type="text/javascript"> 
    var socket = io.connect(); 
    socket.on('faitUneAlerte', function() { 
     alert('Je fais une alerte car on m\'a appelé !'); 
    }); 
</script> 

Наконец * TChat Html *

<!DOCTYPE HTML> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Tchat avec Socket.IO</title> 
    <script type="text/javascript" src="/socket.io/socket.io.js"></script> 
    <style type="text/css"> 
    body { 
     background-color : rgb(50,50,80); 
     color : white; 
     text-align : center; 
    } 
    #tchat { 
     background-color : white; 
     opacity : 0.8; 
     width : 500px; 
     height : 300px; 
     margin : auto; 
     border : 3px rgb(40,40,40) solid; 
     overflow : auto; 
    } 
    .line { 
     border-bottom : 1px rgb(80,80,80) solid; 
     padding : 4px; 
     text-align:left; 
     color : rgb(40,40,40); 
    } 
    </style> 
</head> 
<body> 
    <h1>Tchat avec Socket.IO</h1> 
    <div id="tchat"></div> 
    <form onsubmit="return (envoiMessage());"> 
    <b>Message : </b><input type="text" name="message" id="message" style="width:250px;" /> <input type="submit" value="Envoyer" /> 
    </form> 
    <script type="text/javascript"> 
    // On demande le pseudo de l'utilisateur 
    var pseudo = prompt('Votre pseudo ?') || 'Utilisateur'; 
    // On se connecte au serveur 
    var socket = io.connect(); 
    // On creer l'evenement recupererMessages pour recuperer direcement les messages sur serveur 
    socket.on('recupererMessages', function (messages) { 
    // messages est le tableau contenant tous les messages qui ont ete ecris sur le serveur 
    var html = ''; 
    for (var i = 0; i < messages.length; i++) 
    html += '<div class="line"><b>'+messages[i].pseudo+'</b> : '+messages[i].message+'</div>'; 
    document.getElementById('tchat').innerHTML = html; 
    }); 
    // Si quelqu'un a poste un message, le serveur nous envoie son message avec l'evenement recupererNouveauMessage 
    socket.on('recupererNouveauMessage', function (message) { 
    document.getElementById('tchat').innerHTML += '<div class="line"><b>'+message.pseudo+'</b> : '+message.message+'</div>'; 
    }); 
    // Quand on veut envoyer un message (quand il a valider le formulaire) 
    function envoiMessage(mess) { 
    // On recupere le message 
    var message = document.getElementById('message').value; 
    // On appelle l'evenement se trouvant sur le serveur pour qu'il enregistre le message et qu'il l'envoie a tous les autres clients connectes (sauf nous) 
    socket.emit('nouveauMessage', { 'pseudo' : pseudo, 'message' : message }); 
    // On affiche directement notre message dans notre page 
    document.getElementById('tchat').innerHTML += '<div class="line"><b>'+pseudo+'</b> : '+message+'</div>'; 
    // On vide le formulaire 
    document.getElementById('message').value = ''; 
    // On retourne false pour pas que le formulaire n'actualise pas la page 
    return false; 
    } 
    </script> 
</body> 
</html> 

Наконец * приложение.JS *

var http = require('http'); 
var fs  = require('fs'); 

// Creation du serveur 
var app = http.createServer(function (req, res) { 
    // On lit notre fichier app.html 
    fs.readFile('./tchat.html', 'utf-8', function(error, content) { 
     res.writeHead(200, {'Content-Type' : 'text/html'}); 
     res.end(content); 
    }); 
}); 

// Variables globales 
// Ces variables resteront durant toute la vie du seveur pour et sont commune pour chaque client (node server.js) 
// liste des messages de la forme { pseudo : 'Mon pseudo', message : 'Mon message' } 
var messages = []; 

//// SOCKET.IO //// 

var io  = require('socket.io'); 

// Socket io ecoute maintenant notre application ! 
io = io.listen(app); 

// Quand une personne se connecte au serveur 
io.sockets.on('connection', function (socket) { 
    // On donne la liste des messages (evenement cree du cote client) 
    socket.emit('recupererMessages', messages); 
    // Quand on recoit un nouveau message 
    socket.on('nouveauMessage', function (mess) { 
     // On l'ajout au tableau (variable globale commune a tous les clients connectes au serveur) 
     messages.push(mess); 
     // On envoie a tout les clients connectes (sauf celui qui a appelle l'evenement) le nouveau message 
     socket.broadcast.emit('recupererNouveauMessage', mess); 
    }); 
}); 

/////////////////// 

// Notre application ecoute sur le port 8080 
app.listen(8080); 
console.log('Live Chat App running at http://localhost:8080/'); 
+0

не работает на моей стороне ... На самом деле моя потребность сделать клиента подождать ... –

+0

Это только 1 минута Я отправил этот ответ ... Я отредактировал свой ответ, чтобы лучше понять –

+1

Он хотел использовать веб-порты, а не socket.io –

3

Я думаю, что опрос является путь. Попробуйте что-то вроде этого:

var WebSocket = require('ws'), 
    ws; 

var poll = function() { 

    ws = new WebSocket('ws://localhost:90'); 

    ws.on('open', function() { 
     console.log('Client 1 Started'); 
    }); 

    ws.on('message', function(message) { 
     console.log(message); 
    }); 

    ws.on('error', function(err) { 
     // Check error code? Maybe put it in close event? 
     setTimeout(poll, 1000); 
    }); 

    ws.on('close', function() { 
     console.log('Connection terminated..Closing Client 1'); 
    }); 
} 

В конце концов для того, чтобы ждать запуска сервера вы должны получить какое-то событие с сервера, как «Эй, я до», но тогда вы должны быть уже подключен к нему. Поэтому я не думаю, что есть другой путь.

+0

... Ваша логика хорошая..Но все-таки ее не решить мою проблему ... нужно думать для другого –

+0

@AbhijitMuke О, да, вы должны позвонить 'poll' после определения Это. :) Пропустил это. – freakish

Смежные вопросы