ตามข้อกำหนดโปรโตคอล v76 (ซึ่งเป็นเวอร์ชันที่เบราว์เซอร์ที่มีการสนับสนุนในปัจจุบันใช้งาน):
ในการปิดการเชื่อมต่ออย่างสมบูรณ์เฟรมที่ประกอบด้วยไบต์ 0xFF ตามด้วย 0x00 ไบต์จะถูกส่งจากเพียร์หนึ่งเพื่อขอให้เพียร์อีกคนปิดการเชื่อมต่อ
หากคุณกำลังเขียนเซิร์ฟเวอร์คุณควรแน่ใจว่าได้ส่งเฟรมปิดเมื่อเซิร์ฟเวอร์ปิดการเชื่อมต่อไคลเอ็นต์ บางครั้งวิธีการปิดซ็อกเก็ต TCP ปกติอาจช้าและทำให้แอปพลิเคชันคิดว่าการเชื่อมต่อยังคงเปิดอยู่แม้ว่าจะไม่ได้เปิดอยู่ก็ตาม
เบราว์เซอร์ควรทำสิ่งนี้ให้คุณจริงๆเมื่อคุณปิดหรือโหลดหน้านี้ซ้ำ อย่างไรก็ตามคุณสามารถตรวจสอบให้แน่ใจว่ามีการส่งเฟรมระยะใกล้โดยจับภาพเหตุการณ์ก่อนโหลด:
window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};
ฉันไม่แน่ใจว่าคุณจะได้รับกิจกรรม onclose หลังจากรีเฟรชหน้าแล้วได้อย่างไร อ็อบเจ็กต์ websocket (พร้อมตัวจัดการ onclose) จะไม่มีอยู่อีกต่อไปเมื่อเพจโหลดซ้ำ หากคุณกำลังพยายามสร้างการเชื่อมต่อ WebSocket บนเพจของคุณในทันทีเมื่อเพจโหลดแสดงว่าคุณอาจประสบปัญหาที่เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่อใหม่ในไม่ช้าหลังจากที่เซิร์ฟเวอร์เก่าตัดการเชื่อมต่อ (หรือเบราว์เซอร์ไม่พร้อม เพื่อทำการเชื่อมต่อ ณ จุดที่คุณพยายามเชื่อมต่อ) และคุณกำลังได้รับเหตุการณ์ onclose สำหรับวัตถุ websocket ใหม่
onclose
เหตุการณ์ถูกทริกเกอร์โดยไม่คาดคิดหรืออาจจะเป็นไปตามวัตถุประสงค์เนื่องจากผู้ใช้นำทาง / เพจถูกโหลดซ้ำ ฉันเคยโพสต์คำถามที่ถามว่าพฤติกรรมที่คาดไว้ควรเป็นอย่างไรเบราว์เซอร์ใดที่ถูกต้องและเราใช้การเชื่อมต่ออัตโนมัติอีกครั้ง