ฉันต้องตรวจจับได้เมื่อผู้ใช้ขาดการเชื่อมต่อกับซ็อกเก็ต ดูเหมือนว่า socket.on("disconnect")
จะไม่ถูกเรียกเมื่อฉันปิดแล็ปท็อป ดังนั้นจึงไม่เรียกใช้การโทร ajax ที่จำเป็นต้องทำงานเพื่อที่จะ อัพเดตฐานข้อมูลเพื่อทำเครื่องหมายผู้ใช้ว่าออฟไลน์ ฉันจะตรวจสอบได้อย่างไรว่าการเชื่อมต่อถูกปิดหรืออะไรก็ตาม?
Socket IO ตรวจพบเมื่อไคลเอ็นต์ขาดการเชื่อมต่อ
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
นี่ควรเป็นคำตอบที่ยอมรับได้ มันใช้งานได้ในครั้งแรก... ในกรณีของฉัน การหมดเวลาและช่วงเวลาถูกกำหนดเป็นมิลลิวินาที ดังนั้น 10,000 แทนที่จะเป็น 10... ขอบคุณมาก!
- person Noel Carcases; 26.07.2016
เราก็เจอสิ่งนี้เหมือนกันและตามที่กล่าวไว้ข้างต้นใช้ตัวจับเวลาการเต้นของหัวใจของเราเอง
ตัวอย่างเช่น เซิร์ฟเวอร์จะส่งเสียงฮาร์ทบีททุกๆ 5 วินาที (เราส่งเวลาเซิร์ฟเวอร์แบบง่ายๆ) ไคลเอ็นต์มีเวลานอก 11 วินาที ดังนั้นจึงมีโอกาส 2 ครั้งที่จะจับการเต้นของหัวใจ หากได้รับการเต้นของหัวใจ เราจะรีเซ็ตตัวจับเวลา ถ้าเราพลาดการเต้นของหัวใจทั้งสอง ฟังก์ชันหมดเวลาจะทำงานและคุณทำทุกอย่างที่คุณต้องการ
ค่อนข้างตรงไปตรงมา
person
DomA
schedule
12.02.2013