2013-05-28 49 views
8

Tôi đang thử một ứng dụng trò chuyện đơn giản here với socket.io và node.js. Mỗi lần tôi khởi động lại máy chủ node.js, socket.io sẽ tự động kết nối lại và bằng cách nào đó tạo thêm một kết nối tới máy chủ, tức là máy khách hiện nhận được cùng một tin nhắn trò chuyện hai lần. Làm thế nào để sửa lỗi này?socket.io tạo một kết nối khác sau khi kết nối lại

Trả lời

13

Theo mặc định trên ngắt kết nối socket.io kết nối lại kết nối bị mất, chạy lại sự kiện connect. Vì vậy, mỗi khi nó kết nối lại, bạn thêm một trình xử lý sự kiện để nhận tin nhắn. Vì vậy, bạn nhận được nhiều thông báo bằng máy chủ khởi động lại/mất kết nối.

Incoming Chat: 
Connected 
dsdadsada 
Disconnected       //recieved by 1st listener 
Connected       //added 2nd listener 
adasd 
Disconnected       //recieved by 1st listener 
Disconnected       //recieved by 2nd listener 
Connected       //added 3rd listener 

Bạn nên lắng nghe người đầu tiên kết nối sử dụng once thay vì on, chạy eventhandler lần đầu tiên mà thôi. Hãy thử

iosocket.once('connect', function() { 

thay vì

iosocket.on('connect', function() { 
+0

Lý tưởng nhất là bạn không nên thêm trình xử lý sự kiện (hoặc bất kỳ tính năng ứng dụng nào khác) vào kết nối. – Shamps

+0

Ở phía máy chủ, điều này có thể được sửa bằng cách sử dụng không gian tên. Điều này cho phép bạn sử dụng 'once' cho sự kiện' connect' của ngón chân của máy khách trên máy chủ. Đáng buồn thay, chúng tôi không có 'một lần' cho máy chủ trực tiếp:' io.once ('connect', (socket: SocketIO.Socket) => {}) 'đưa ra một lỗi compilining trong TS, trong khi' io.of ('/xyz').once('connect', (socket: SocketIO.Socket) => {}) 'hoạt động tốt. – Lion

5

Cố gắng viết index.html theo cách này thay vì:

iosocket.on('connect', function() { 
     $('#incomingChatMessages').append($('<li>Connected</li>')); 
}); 

iosocket.on('message', function(message) { 
     $('#incomingChatMessages').append($('<li></li>').text(message)); 
}); 

iosocket.on('disconnect', function() { 
     $('#incomingChatMessages').append('<li>Disconnected</li>'); 
}); 

Nó có thể được gây ra bởi 2 eventlisteners khác đã được đăng ký sự kiện kết nối. Khi khách hàng bị ngắt kết nối, 2 người nghe khác sẽ vẫn ở đây và không bị đăng ký.

+1

Tôi nghĩ giải pháp của bạn tốt hơn. NHỮNG ĐIỀU QUAN TRỌNG Ở ĐÂY LÀ R INNG TRONG L SCRNH VỰC KHÁCH HÀNG, BẠN BAO GIỜ CÁC SỰ KIỆN KHÁC TỪ SỰ KIỆN 'CONNECT'. (XIN VUI LÒNG TRÊN NGOÀI SỰ KIỆN CONNECT) –

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