socket.io บังคับให้ตัดการเชื่อมต่อผ่าน XHR-polling

ฉันมีแอปพลิเคชันไคลเอ็นต์/เซิร์ฟเวอร์ที่ใช้ nodejs บนเซิร์ฟเวอร์และ socket.io เป็นกลไกการเชื่อมต่อ ด้วยเหตุผลที่เกี่ยวข้องกับแอปพลิเคชันของฉัน ฉันต้องการให้มีเพียงการเชื่อมต่อที่ใช้งานอยู่ต่อเบราว์เซอร์เท่านั้น และปฏิเสธการเชื่อมต่อทั้งหมดจากแท็บอื่นที่อาจเปิดในภายหลังระหว่างเซสชัน สิ่งนี้ใช้งานได้ดีกับ WebSockets แต่ถ้าเบราว์เซอร์ไม่รองรับ WebSockets และใช้ XHR-polling แทน การตัดการเชื่อมต่อจะไม่เกิดขึ้น ดังนั้นหากผู้ใช้เพียงแค่รีเฟรชหน้า สิ่งนี้จะไม่ถูกตีความว่าเป็นการเชื่อมต่อใหม่ ( ฉันมีความล่าช้าสำหรับ การเชื่อมต่อใหม่และการกู้คืนเซสชัน) แต่เป็นแท็บใหม่ ซึ่งสิ้นสุดในการเชื่อมต่อที่ถูกปฏิเสธเนื่องจากการเชื่อมต่อเก่าที่ทำโดยแท็บเดียวกันนี้ยังคงทำงานอยู่

ฉันกำลังมองหาวิธียุติการเชื่อมต่อจากไคลเอนต์อย่างมีประสิทธิภาพทุกครั้งที่มีการรีเฟรชเกิดขึ้น ฉันได้ลองผูกเข้ากับ beforeunload และเรียก socket.disconnect() ทางฝั่งไคลเอ็นต์แล้ว และยังส่งข้อความเช่น socket.emit('force-disconnect') และทำให้เกิดการตัดการเชื่อมต่อจากเซิร์ฟเวอร์โดยไม่สำเร็จ ฉันพลาดอะไรไปที่นี่หรือเปล่า? ขอบคุณที่คุณช่วย!

ฉันได้อ่านคำถามนี้แล้ว และทำได้ ไม่พบว่ามีประโยชน์สำหรับกรณีเฉพาะของฉัน


person scanales    schedule 20.08.2012    source แหล่งที่มา


คำตอบ (2)


แก้ไขปัญหาแล้ว ปรากฎว่าเป็นข้อบกพร่อง ที่นำมาใช้ใน socket.io 0.9.5 หากคุณประสบปัญหานี้ เพียงอัปเดตทั้งเซิร์ฟเวอร์และโค้ดฝั่งไคลเอ็นต์เป็น socket.io > 0.9.9 และตั้งค่าตัวเลือกฝั่งไคลเอ็นต์ socket.io sync disconnect on unload เป็น true เท่านี้ก็เรียบร้อย

ตัวเลือกได้รับการตั้งค่าดังนี้:

var socket = io.connect('http://yourdomain.com', {'sync disconnect on unload' : true});
person scanales    schedule 21.08.2012
comment
ฉันทำอย่างนั้นอย่างแน่นอน... 1) npm ติดตั้ง socket.io 2)npm ติดตั้ง socket.io-client 3) var socket = io.connect('yourdomain.com', {'ซิงค์ตัดการเชื่อมต่อเมื่อยกเลิกการโหลด' : true}); ทางฝั่งไคลเอ็นต์ Xhr-polling ทำงานได้ดีบนเบราว์เซอร์ Chrome แต่ไม่ใช่บน iPad ของฉัน - person ngzhongcai; 29.08.2012
comment
อืมไม่แน่ใจว่าทำไม iPad ถึงจัดการมันแตกต่างออกไป ... คุณได้ลองปิดการใช้งานการขนส่งอื่น ๆ ทั้งหมดเพื่อให้แน่ใจว่ามันเกิดขึ้นเฉพาะผ่านการโพล XHR เนื่องจากเป็นการขนส่งที่เรากำลังพูดถึงที่นี่หรือไม่ - person scanales; 29.08.2012
comment
แน่นอนมาก มีเพียง xhr-polling ในตัวเลือกการขนส่ง - person ngzhongcai; 02.09.2012
comment
คิดว่าจะรอให้ engine.io รวมเข้าด้วยกัน - person ngzhongcai; 02.09.2012
comment
ยอดเยี่ยม - ช่วยฉันด้วยปัญหาใหญ่บางอย่าง นี่เป็นคำถามที่แท้จริงสำหรับคุณ: คุณพบตัวเลือกนี้ได้อย่างไร ดูเหมือนว่าฉันจะเห็นสิ่งนี้ใน StackOverflow และส่วนที่เหลือเท่านั้น คุณทำอะไรเพื่อค้นพบธงนี้ สำหรับนักสำรวจที่กล้าหาญคนอื่นๆ: ฉันพบหน้านี้สำหรับตัวเลือกการกำหนดค่า socket.io ผ่าน Googling บางตัว github.com/LearnBoost/socket.io/wiki/Configuring-Socket ไอโอ - person EML; 04.04.2013
comment
@EML ตัวเลือกอยู่ที่นั่นใน URL ที่คุณพูดถึงใต้ส่วนหัวของไคลเอ็นต์ - person scanales; 16.04.2013
comment
ใช่ นั่นคือเหตุผลที่ฉันโพสต์เพจ ฉันพบมันได้อย่างง่ายดายหลังจากที่คุณนำเสนอชื่อตัวเลือก - person EML; 16.04.2013
comment
ขอบคุณ! มันช่วยฉันได้จริงๆ .. จะโพสต์ไว้ในฟอรัมและสิ่งต่างๆ : D - person julian; 29.07.2013
comment
@อิสราเอลจี. ฉันขอขอบคุณลิงก์ไปยังคำถามนี้! - person scanales; 29.07.2013
comment
@ngzhongcai ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่การซิงค์ตัดการเชื่อมต่อไม่ทำงานบน iOS: stackoverflow.com/a/18064892/69868 - person Miroslav Bajtoš; 09.08.2013

คุณยังสามารถได้รับ "ข้อผิดพลาด: ข้อผิดพลาดการสำรวจ xhr" หากคุณไม่มีคำอธิบายไฟล์ที่เปิดอยู่ สิ่งนี้น่าจะเกิดขึ้นระหว่างการทดสอบโหลด

ตรวจสอบขนาดตัวอธิบายไฟล์ที่เปิดปัจจุบัน:

ulimit -n

เพิ่มเป็นจำนวนสูง:

ulimit -n 1000000
person Deniz Ozger    schedule 30.01.2014