2014-07-04 17 views
15

Ich kann nicht herausfinden, warum das Trennen/Verbinden einer socket.io-Verbindung mehrmals nicht funktioniert? seitigen Codesocket.io Clientverbindung trennen

Server:

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

Client-Seite Code:

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

Es trennt in Ordnung. Aber verbindet sich nicht wieder. Ich benutze Socket.io 1.0. Bitte helfen Sie.

+0

Ihr Beispiel funktioniert für mich. – vinayr

+0

es funktioniert einmal. aber funktioniert es oft? Es ist nicht für mich. Ich habe geschätzt, dass die socket.id ändert und dann die Verbindung nicht mehr mit der socket.id der neuen Verbindung verbunden ist. Nur eine Vermutung :-) –

Antwort

33

Haben Sie diese Konfiguration im Client versucht?

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

Ich habe es erneut versucht, und jetzt funktioniert es. Ich poste den Arbeitscode - er kann anderen helfen. –

+0

Danke @jujuleder! Weißt du, wo die Dokumentation für diese io.connect-Konfigurationen ist? Ich konnte es nirgends finden. – ksloan

+0

Beachten Sie auch, dass Sie SERVER_IP nicht angeben müssen. 'io.connect ({'forceNew': true});' verwendet einfach die Root-URL. –

19

Diese Lösung, die auf Jujuleders Antwort basiert, funktioniert. Offenbar in socket.io 1.0 ist es "forceNew" statt "erzwinge neue Verbindung" - beide funktionieren.

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

Beginnen wir nicht in einem einzigen Browser, der doppelte Socket-Verbindungen erzeugt. Ich habe mit diesem Käfer Frieden geschlossen. –

+1

Können frühere Hörerereignisse für die neue Verbindung nicht verarbeitet werden? Muss ich der Socket-Verbindung neue Listener hinzufügen? – Vishnu

+0

@KayaToast Wie kann man das beheben? –

Verwandte Themen