2014-07-04 5 views
15

Non riesco a capire perché la disconnessione/connessione di una connessione socket.io più volte non funzioni?socket.io client connect disconnect

codice lato server:

io.on('connection', function(socket){ 
    console.log('a user connected'); 
    socket.on('disconnect', function(){ 
     console.log('user disconnected'); 
    }); 
}); 

client codice lato:

var socket = io(); 
socket.on('connect', function() { 
    console.log("connected from the client side"); 
}); 
$('#connect_button').click(function(){ 
    socket.connect(); 
}); 
$('#disconnect_button').click(function(){ 
    socket.disconnect(); 
}); 

Si stacca bene. Ma non si ricollega. Sto usando Socket.io 1.0. Per favore aiuto.

+0

Il vostro esempio funziona per me. – vinayr

+0

funziona una volta. ma funziona molte volte? Non fa per me. Stavo indovinando le modifiche di socket.id e quindi la disconnessione non è più associata a socket.id della nuova connessione. Solo un'ipotesi :-) –

risposta

33

Hai provato questa configurazione nel client?

// 0.9 socket.io version 
io.connect(SERVER_IP, {'force new connection': true}); 

// 1.0 socket.io version 
io.connect(SERVER_IP, {'forceNew': true}); 
+1

Ho provato di nuovo, e ora funziona. Pubblicherò il codice di lavoro: potrebbe aiutare gli altri. –

+0

Grazie @jujuleder! Sai dove si trova la documentazione di queste configurazioni io.connect? Non riuscivo a trovarlo da nessuna parte. – ksloan

+0

Inoltre, non è necessario specificare SERVER_IP. 'io.connect ({'forceNew': true});' semplicemente utilizzerà per default l'url di root. –

19

Questa soluzione, basata sulla risposta di Jujuleder funziona. Apparentemente in socket.io 1.0, è "forceNew" invece di "force new connection" - entrambi funzionano però.

Server:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendfile('s.html'); 
}); 

io.on('connection', function(socket){ 
    console.log('a user connected: ' + socket.id); 
    socket.on('disconnect', function(){ 
     console.log(socket.name + ' has disconnected from the chat.' + socket.id); 
    }); 
    socket.on('join', function (name) { 
     socket.name = name; 
     console.log(socket.name + ' joined the chat.'); 
    }); 
}); 

http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

client (s.html):

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
    <style>button{width: 100px;}input{width: 300px;}</style> 
</head> 
<body> 

<ul id="messages"></ul> 

<button id="disconnect">disconnect</button> 
<button id="connect">connect</button> 

<script src="/socket.io/socket.io.js"></script> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 

    var socket = io.connect('http://localhost:3000'); 

    $('#disconnect').click(function(){ 
     socket.disconnect(); 
    }); 
    $('#connect').click(function(){ 
//  socket.socket.reconnect(); 
//  socket = io.connect('http://localhost:3000',{'force new connection':true }); 
     socket = io.connect('http://localhost:3000',{'forceNew':true }); 
     socket.on('connect', function(msg){ 
      socket.emit('join', prompt('your name?')); 
     }); 
    }); 
    socket.on('connect', function(msg){ 
     socket.emit('join', prompt('your name?')); 
    }); 
    socket.on("disconnect", function(){ 
     console.log("client disconnected from server"); 
    }); 

</script> 
</body> 
</html> 
+5

Non iniziamo con una singola richiesta del browser che genera connessioni a doppio socket. Ho fatto pace con quell'insetto. –

+1

Non è possibile gestire eventi listener precedenti per la nuova connessione? È necessario aggiungere nuovi listener alla connessione socket? – Vishnu

+0

@KayaToast Come si risolve questo? –