Socket IO ตรวจพบเมื่อไคลเอ็นต์ขาดการเชื่อมต่อ

ฉันต้องตรวจจับได้เมื่อผู้ใช้ขาดการเชื่อมต่อกับซ็อกเก็ต ดูเหมือนว่า socket.on("disconnect") จะไม่ถูกเรียกเมื่อฉันปิดแล็ปท็อป ดังนั้นจึงไม่เรียกใช้การโทร ajax ที่จำเป็นต้องทำงานเพื่อที่จะ อัพเดตฐานข้อมูลเพื่อทำเครื่องหมายผู้ใช้ว่าออฟไลน์ ฉันจะตรวจสอบได้อย่างไรว่าการเชื่อมต่อถูกปิดหรืออะไรก็ตาม?


person Dylan Cross    schedule 07.02.2012    source แหล่งที่มา
comment
ฉันจะเสนอให้มีผู้ฟังหรือ 'ฮาร์ทบีท' ที่ตรวจสอบไคลเอนต์เพื่อรับการตอบสนองจากเซิร์ฟเวอร์ นั่นคือสิ่งที่ฉันทำ   -  person Barry Chapman    schedule 07.02.2012
comment
ฉันทำสิ่งนี้ในเว็บไซต์เวอร์ชันก่อนหน้าของฉัน แม้ว่าจะมีจำนวนผู้ใช้เพียงพอในเวลาที่กำหนด แต่ดูเหมือนว่าจะเป็นการโอเวอร์โหลดบนเซิร์ฟเวอร์ เท่าที่จำนวนคำขอดำเนินไป แม้ว่ามันอาจจะดีที่สุดก็ตาม และ ตัวเลือกเท่านั้น   -  person Dylan Cross    schedule 07.02.2012
comment
socket.io ใช้การเต้นของหัวใจ ดังนั้นฉันแน่ใจว่าสิ่งนี้สามารถทำได้   -  person EhevuTov    schedule 08.02.2012
comment
เมื่อฉันพบว่ามันตรวจพบว่ามันตัดการเชื่อมต่อ มันจะทริกเกอร์การตัดการเชื่อมต่อในไฟล์เซิร์ฟเวอร์ อย่างไรก็ตาม มันไม่สามารถปล่อยการตัดการเชื่อมต่อไปยังเพจที่ได้รับคำแนะนำให้เริ่มการเรียก ajax เพื่ออัปเดตฐานข้อมูล ไม่ว่าจะด้วยเหตุผลใดก็ตาม ดังนั้นฉันจึงต้องหาวิธีอัปเดตฐานข้อมูลจากไฟล์เซิร์ฟเวอร์ ซึ่งฉันไม่แน่ใจว่าต้องทำอย่างไร   -  person Dylan Cross    schedule 08.02.2012
comment
คุณสามารถโทรกลับหรือตัวส่งเหตุการณ์ที่กำหนดเอง + สมาชิกได้   -  person mtsr    schedule 09.02.2013


คำตอบ (2)


ตามที่กล่าวไว้ที่นี่ https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO, Socket.IO มีการใช้งานแบบฮาร์ตบีตของตัวเอง แต่ค่าเริ่มต้นคือช่วงเวลา 25 วินาทีและขีดจำกัด 60 วินาทีสำหรับการเชื่อมต่อที่ขาดหายไป

คำแนะนำของฉัน: ตั้งค่าเริ่มต้นตามที่คุณคาดหวังจากการทดสอบ มิฉะนั้นคุณอาจพลาดเกณฑ์

ตัวอย่าง:

socket.set("heartbeat timeout", 10);
socket.set("heartbeat interval", 5);
person sja    schedule 24.07.2013
comment
นี่ควรเป็นคำตอบที่ยอมรับได้ มันใช้งานได้ในครั้งแรก... ในกรณีของฉัน การหมดเวลาและช่วงเวลาถูกกำหนดเป็นมิลลิวินาที ดังนั้น 10,000 แทนที่จะเป็น 10... ขอบคุณมาก! - person Noel Carcases; 26.07.2016

เราก็เจอสิ่งนี้เหมือนกันและตามที่กล่าวไว้ข้างต้นใช้ตัวจับเวลาการเต้นของหัวใจของเราเอง

ตัวอย่างเช่น เซิร์ฟเวอร์จะส่งเสียงฮาร์ทบีททุกๆ 5 วินาที (เราส่งเวลาเซิร์ฟเวอร์แบบง่ายๆ) ไคลเอ็นต์มีเวลานอก 11 วินาที ดังนั้นจึงมีโอกาส 2 ครั้งที่จะจับการเต้นของหัวใจ หากได้รับการเต้นของหัวใจ เราจะรีเซ็ตตัวจับเวลา ถ้าเราพลาดการเต้นของหัวใจทั้งสอง ฟังก์ชันหมดเวลาจะทำงานและคุณทำทุกอย่างที่คุณต้องการ

ค่อนข้างตรงไปตรงมา

person DomA    schedule 12.02.2013