3

我正在尝试在网络套接字上建立连接。但我无法让它等到服务器 Started 。每当我在没有服务器运行的情况下启动我的客户端时,我就会陷入错误事件。我应该怎么做才能让我的客户端等到服务器启动?

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

3 回答 3

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

毕竟为了等待服务器启动,你必须从服务器接收一些事件,比如“嘿,我起来了”,但是你必须已经连接到它。所以我认为没有其他方法。

于 2012-12-19T14:39:00.933 回答
1

为您从法语翻译成英语 ^ ^ 来自http://www.atinux.fr/2011/08/28/tutoriel-socket-io-debutant/的 node.js 上 tchat 的小话题(抱歉用法语发表评论)

服务器端

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>

傍晚

要创建事件,只需执行以下操作:

    socket.on('monEvenement', maFonction);

如您所见,套接字变量尚未在服务器端声明,事实上,它应该由于事件“连接”而恢复

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

});

呼叫晚会

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/');
于 2012-12-19T13:42:22.550 回答
-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');
});
}
于 2012-12-20T05:07:55.373 回答