web-dev-qa-db-fra.com

socket.io - L'événement 'connect' ne se déclenche pas sur le client

J'essaie de démarrer avec node.js et socket.io.
J'ai une application de test client-serveur très (très) simple et je ne peux pas la faire fonctionner.
Le système est installé sur une machine Windows avec un serveur Apache.
L'Apache fonctionne sur port 81 et le socket.io est configuré pour écouter port 8001

Serveur - server.js

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

io.sockets.on('connection', function (socket) {
    console.log('\ngot a new connection from: ' + socket.id + '\n');
});

Client - index.html

<!DOCTYPE html>
<html>
<head>
    <title>node-tests</title>
    <script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js">    </script>
    <script type="text/javascript">
        var socket = io.connect('http://localhost', { port: 8001 });

        socket.on('connect', function () {
            alert('connect');
        });

        socket.on('error', function (data) {
            console.log(data || 'error');
        });

        socket.on('connect_failed', function (data) {
            console.log(data || 'connect_failed');
        });
    </script>
</head>
<body>

</body>
</html>

Après avoir démarré mon serveur à l'aide de node server.js la sortie standard (attendue) est écrite sur la console du serveur:

info: socket.io started

Quand j'ouvre index.html dans le navigateur (chrome dans mon cas - n'a pas testé sur d'autres navigateurs) le journal suivant est écrit sur la console du serveur:

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 9952353481638352052
debug: setting request GET /socket.io/1/websocket/9952353481638352052
debug: set heartbeat interval for client 9952353481638352052
debug: client authorized for

got a new connection from: 9952353481638352052

debug: setting request GET /socket.io/1/xhr-polling/9952353481638352052?t=1333635235315
debug: setting poll timeout
debug: discarding transport
debug: cleared heartbeat interval for client 9952353481638352052
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635238316&i=0
debug: setting poll timeout
debug: discarding transport
debug: clearing poll timeout
debug: clearing poll timeout
debug: jsonppolling writing io.j[0]("8::");
debug: set close timeout for client 9952353481638352052
debug: jsonppolling closed due to exceeded duration
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635258339&i=0
...
...
...

Dans la console des navigateurs, j'obtiens:

connect_failed

Il semble donc que le client atteigne le serveur et essaie de se connecter, et le serveur autorise la prise de contact mais l'événement connect n'est jamais déclenché dans le client, à la place la méthode connect atteint son connect timeout et max reconnection attempts et renonce à revenir connect_failed.

Toute aide\aperçu à ce sujet serait utile.

Je vous remercie

29
kfiroo
//Client side
<script src="http://yourdomain.com:8001/socket.io/socket.io.js"></script>
var socket = io.connect('http://yourdomain.com:8001');

//Server side
var io = require('socket.io').listen(8001);
io.sockets.on('connection',function(socket) {
`console.log('a user connected');`
});

Côté client: le code côté client demande la version client de socket IO du même fichier qui vous donne socketIO côté serveur. Le socket Var aura désormais toutes les méthodes disponibles avec socketIO, telles que socket.emit ou socket.on

Côté serveur: identique au côté client, ce qui rend les méthodes socketIO disponibles pour une utilisation sous var io.

7
jDubs

Changement dans le frontend (client):

var socket = io.connect(http://myapp.herokuapp.com);

à

var socket = io.connect();

Après plusieurs heures de traitement avec divers clients (navigateurs Chrome, Firefox et application Phonegap) qui n'ont pas correctement enregistré la connexion au serveur (c'est-à-dire le serveur a enregistré la connexion Websocket avec succès dans ses journaux, mais le frontend n'a pas enregistré le événement de connexion), j'ai essayé la solution de @ Timothy à partir des commentaires et maintenant tout fonctionne à nouveau sur heroku et sur localhost.

3
AmpT

Essayez d'utiliser ceci:

Server.js

var http = require("http").createServer(), io = require("socket.io").listen(http);

http.listen(8001);

io.sockets.on("connection", function(socket){
    console.log("Connected!");
    socket.emit("foo", "Now, we are connected");
});

index.html

<script src="http://localhost:8001/socket.io/socket.io.js"></script>
<script>
     var i = io.connect("http://localhost:5001");
     i.on("foo", function(bar){
         console.log(bar);
     })
</script>
0
ZeroBryan

Essayez ce qui suit:

Changement

var socket = io.connect('http://localhost', { port: 8001 });

à

var socket = io.connect('http://localhost:8001');
0
zallarak