2015-12-03 19 views
7

Tôi cố gắng để reconnecct ổ cắm sau sự kiện ngắt kết nối là bắn với cùng socket.id ở đây là ổ cắm của tôi cấu hìnhReconnect ổ cắm trong trường hợp ngắt kết nối

var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var connect_clients = [] //here would be the list of socket.id of connected users 
http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

Vì vậy, về sự kiện ngắt kết nối tôi muốn kết nối người sử dụng bị ngắt kết nối với cùng socket.id nếu có thể

socket.on('disconnect',function(){ 
var disconnect_id = socket.id; //i want reconnect the users here 
}); 
+0

Có vẻ như bạn đang giả định rằng một 'socket.id' sẽ xác định duy nhất một _user_ thay vì một _connection_. Máy chủ sẽ [tạo một id mới cho mỗi kết nối] (https://github.com/socketio/engine.io/blob/ec673d11f162801b833a516526c1e36fa38f81b6/lib/server.js#L262) và bạn không thể ghi đè điều đó. – robertklep

+0

ok nếu cùng socket.id không thể kết nối lại tôi muốn kết nối lại chúng với id ổ cắm mới được tạo sau đó –

+0

Giá trị mặc định cho 'socket.io-client' _is_ tự động kết nối lại (được ghi lại [ở đây] (http://socket.io/ docs/client-api/# manager (url: chuỗi, -opts: đối tượng)), tùy chọn 'reconnection'). – robertklep

Trả lời

6

Theo mặc định, Socket.IO không có Logic server-side để kết nối lại. Điều đó có nghĩa là mỗi khi một khách hàng muốn kết nối, một đối tượng socket mới được tạo ra, do đó nó có một id mới. Đó là vào bạn để thực hiện kết nối lại.

Để làm như vậy, bạn sẽ cần một cách để lưu trữ nội dung nào đó cho người dùng này. Nếu bạn có bất kỳ loại xác thực nào (ví dụ: hộ chiếu) - sử dụng socket.request, bạn sẽ có yêu cầu HTTP ban đầu được kích hoạt trước khi nâng cấp xảy ra. Vì vậy, từ đó, bạn có thể có tất cả các loại cookie và dữ liệu đã được lưu trữ.

Nếu bạn không muốn lưu trữ bất kỳ thứ gì trong cookie, điều dễ nhất cần làm là gửi lại cho khách hàng thông tin cụ thể về bản thân, khi kết nối. Sau đó, khi người dùng cố gắng kết nối lại, hãy gửi lại thông tin này. Một cái gì đó như:

var client2socket = {}; 
io.on('connect', function(socket) { 
    var uid = Math.random(); // some really unique id :) 
    client2socket[uid] = socket; 

    socket.on('authenticate', function(userID) { 
     delete client2socket[uid]; // remove the "new" socket 
     client2socket[userID] = socket; // replace "old" socket 
    }); 
}); 

Hãy nhớ đây chỉ là một mẫu và bạn cần phải thực hiện một cái gì đó tốt hơn một chút :) Có lẽ gửi thông tin như một param yêu cầu, hoặc lưu trữ nó một cách khác - bất cứ điều gì làm việc cho bạn.

+0

như trong api khách hàng cung cấp cho một số tùy chọn cho reconect nhưng tôi đã không thể sử dụng nó do tài liệu nghèo của nó để bạn có thể giúp tôi ra? –

+0

Uhhh, socket.io cũng có logic để kết nối lại vì vậy đoạn đầu tiên của bạn có vẻ hoàn toàn sai. – jfriend00

+0

Tệ của tôi, muốn nói ** logic bên **. Cảm ơn đã chỉ ra điều đó! –

Các vấn đề liên quan