I am trying for making connection on web socket.But I'm unable to make it wait until server Started . Whenever I start my client without Server running I got caught in error event..What should I have to do to make my Client wait until Server get Start ?
My Client in 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');
});
Translated from French to English just for you ^ ^ small topic for tchat on node.js (sorry for comment in french) from http://www.atinux.fr/2011/08/28/tutoriel-socket-io-debutant/
Server Side
var io = require('socket.io');
It must then, after creating the HTTP server with Node JS, Socket.IO to listen to it:
io = io.listen(app);
client side
You need to insert the link to the library in the header. Html:
<script type="text/javascript" src="/socket.io/socket.io.js">
Then you have a new connect to the server:
<script type="text/javascript">
var socket = io.connect();
</script>
Evenement
To create an event, simply do:
socket.on('monEvenement', maFonction);
As you can see, the socket variable is not yet declared the server side, in fact, it should recover thanks to the event "connection"
io.sockets.on('connection', function (socket) {
});
Call Evenement
socket.emit('monEvenement', mesDonnees);
Other broadcast
socket.broadcast.emit('monEvenement', mesDonnees);
Example server side
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 client-side
<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>
Finally *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>
Finally *app.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/');
I think polling is the way to go. Try something like this:
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');
});
}
After all in order to wait for server start you would have to receive some event from the server, like "hey, I'm up", but then you would have to be already connected to it. So I don't think there is other way.
Its Work For me...Now Client can wait still Server get 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');
});
}