如何在Node.js中使websocket等待

时间:2012-12-19 13:31:22

标签: 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');
});

2 个答案:

答案 0 :(得分:1)

仅为您翻译法语到英语^ ^ node.js上tchat的小主题(对不起法语评论) 来自http://www.atinux.fr/2011/08/28/tutoriel-socket-io-debutant/

服务器端

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

然后,在创建带有Node JS的HTTP服务器之后,必须使用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);

正如您所看到的,套接字变量尚未声明为服务器端,事实上,它应该通过事件&#34;连接&#34;

恢复
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');
});

以客户端为例

<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>

<强>最后 * 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/');

答案 1 :(得分:-1)

它的工作对我来说......现在客户端可以等待服务器开始...

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');
});
}