ในโพสต์บล็อกก่อนหน้าของฉัน socket.io ฉันแนะนำการใช้งานขั้นพื้นฐานของ socket.io สั้น ๆ และสร้างการสาธิตห้องแชทง่าย ๆ จากบทเบื้องต้นบทความนี้ยังคงสำรวจการใช้งานขั้นสูงของ socket.io บทความนี้จะเริ่มต้นจากการกำหนดค่าห้องพักกิจกรรม ฯลฯ และแนะนำ API ที่ใช้งานได้จริงและข้อควรระวังใน Socket.io
1. การกำหนดค่า
socket.io ให้ 4 การกำหนดค่า API: io.configure, io.set, io.enable, io.disable IO.Set ตั้งค่ารายการเดียวและ IO.enable และ IO.Disable ใช้เพื่อตั้งค่าการกำหนดค่าบูลีนในรายการเดียว IO.Configure ช่วยให้คุณกำหนดค่าพารามิเตอร์ที่แตกต่างกันสำหรับสภาพแวดล้อมการผลิตที่แตกต่างกัน (เช่นการพัฒนาการทดสอบ ฯลฯ ) ต่อไปนี้กำหนดการกำหนดค่าที่แตกต่างกันของ socket.io ในสองสภาพแวดล้อม:
การคัดลอกรหัสมีดังนี้:
var io = ต้องการ ('socket.io') ฟัง (80);
io.configure ('การพัฒนา', function () {
io.enable ('ไคลเอนต์เบราว์เซอร์ etag');
io.set ('ระดับบันทึก', 1);
-
io.configure ('release', function () {
io.set ('transports', ['websocket']);
-
รายการต่อไปนี้แสดงรายการการกำหนดค่าที่ใช้กันทั่วไป สำหรับพารามิเตอร์การกำหนดค่าเฉพาะโปรดดูที่วิกิทางการ
1) .transports (ค่าเริ่มต้น ['WebSocket', 'htmlfile', 'XHR-polling', 'JSONP-polling']): อาร์เรย์ที่มีวิธีการสื่อสาร Socket.io สนับสนุนวิธีการที่หลากหลายในการรับรู้การสื่อสารออนไลน์ทันทีเช่น WebSocket, Polling ฯลฯ การกำหนดค่านี้ช่วยให้คุณสามารถเลือกวิธีการสื่อสารสำรองด้วยตัวคุณเอง
2). ระดับล็อก (ค่าเริ่มต้น 3): ระดับต่ำสุดของเอาต์พุตบันทึก, 0 คือข้อผิดพลาด, 1 คือเตือน, 2 คือข้อมูลและ 3 คือการดีบักและบันทึกทุกประเภทจะถูกส่งออกตามค่าเริ่มต้น
3). ช่วงเวลาของ HeartBeat (ค่าเริ่มต้น 25 วินาที): ช่วงเวลาการส่ง HeartBeat Packet, ไคลเอนต์ต้องส่งแพ็กเก็ต HeartBeat ไปยังเซิร์ฟเวอร์ภายในช่วงเวลานี้เพื่อรักษาการสื่อสาร
2. ห้องพัก
ห้องพักเป็นคุณสมบัติที่มีประโยชน์มากโดย socket.io ห้องพักเทียบเท่ากับการจัดหาเนมสเปซสำหรับลูกค้าที่ระบุบางรายและการออกอากาศและการสื่อสารทั้งหมดในห้องจะไม่ส่งผลกระทบต่อลูกค้านอกห้อง
ในบทนำเรารู้ว่า socket.join ('ชื่อห้อง') สามารถใช้เพื่อเข้าห้องโดยลูกค้าและซ็อกเก็ต Leave ('ชื่อห้อง') ใช้เพื่อออกจากห้อง เมื่อลูกค้าเข้าสู่ห้องข้อความสามารถออกอากาศในห้องได้สองวิธี:
การคัดลอกรหัสมีดังนี้:
// 1. ออกอากาศเหตุการณ์ไปยังห้องของฉันและผู้ส่งจะได้รับการยกเว้น (นั่นคือจะไม่ได้รับข้อความ)
io.sockets.on ('การเชื่อมต่อ', ฟังก์ชั่น (ซ็อกเก็ต) {
// หมายเหตุ: เปรียบเทียบกับสิ่งต่อไปนี้นี่คือการส่งเหตุการณ์จากมุมมองของลูกค้า
Socket.broadcast.to ('My Room'). emit ('event_name', ข้อมูล);
-
// 2. ออกอากาศเหตุการณ์ไปยังห้องอื่นและลูกค้าทุกคนในห้องนี้จะได้รับข้อความ
// หมายเหตุ: เปรียบเทียบกับข้างต้นนี่คือการส่งเหตุการณ์จากมุมมองของเซิร์ฟเวอร์
io.sockets.in ('ห้องอื่น'). emit ('event_name', ข้อมูล);
// ออกอากาศไปยังลูกค้าทั้งหมด
io.sockets.emit ('event_name', ข้อมูล);
นอกเหนือจากการออกอากาศข้อความไปยังห้องคุณยังสามารถรับข้อมูลห้องผ่าน API ต่อไปนี้
การคัดลอกรหัสมีดังนี้:
// รับข้อมูลเกี่ยวกับทุกห้อง
// key คือชื่อห้องค่าคืออาร์เรย์ ID ซ็อกเก็ตที่สอดคล้องกับชื่อห้อง
io.sockets.Manager.rooms
// รับลูกค้าในห้องโดยเฉพาะและส่งคืนอินสแตนซ์ของซ็อกเก็ตทั้งหมดในห้องนี้
io.sockets.clients ('ห้องเฉพาะ')
// รับข้อมูลห้องที่ป้อนโดยซ็อกเก็ตนี้ผ่าน Socket.id
io.sockets.Manager.roomclients [socket.id]
3. เหตุการณ์
Socket.io มีเหตุการณ์เริ่มต้นในตัว เมื่อออกแบบเหตุการณ์เราควรหลีกเลี่ยงชื่อเหตุการณ์เริ่มต้นและใช้กิจกรรมเริ่มต้นเหล่านี้อย่างยืดหยุ่น
เหตุการณ์ฝั่งเซิร์ฟเวอร์:
1) .io.sockets.on ('การเชื่อมต่อ', ฟังก์ชั่น (ซ็อกเก็ต) {}): ทริกเกอร์หลังจากการเชื่อมต่อซ็อกเก็ตสำเร็จใช้สำหรับการเริ่มต้น
socket.on ('ข้อความ', ฟังก์ชั่น (ข้อความ, การโทรกลับ) {}): เหตุการณ์นี้ถูกทริกเกอร์เมื่อไคลเอนต์ส่งข้อความผ่านซ็อกเก็ตเซนด์ ข้อความคือข้อความที่ส่ง การโทรกลับคือการโทรกลับที่จะดำเนินการหลังจากได้รับข้อความ
2) .socket.on ('อะไร', ฟังก์ชั่น (ข้อมูล) {}): ถูกไล่ออกเมื่อได้รับเหตุการณ์ใด ๆ
3) .socket.on ('ตัดการเชื่อมต่อ', ฟังก์ชั่น () {}): ทริกเกอร์เมื่อซ็อกเก็ตสูญเสียการเชื่อมต่อ (รวมถึงสถานการณ์การตัดการเชื่อมต่อเช่นการปิดเบราว์เซอร์ตัดการเชื่อมต่อการตัดการเชื่อมต่อ ฯลฯ ) อย่างแข็งขัน)
กิจกรรมของลูกค้า:
1) .Connect: การเชื่อมต่อสำเร็จ
2). การเชื่อมต่อ: การเชื่อมต่อ
3) .Disconnect: ตัดการเชื่อมต่อ
4) .connect_failed: การเชื่อมต่อล้มเหลว
5) .error: เกิดข้อผิดพลาดและไม่สามารถประมวลผลได้โดยประเภทเหตุการณ์อื่น ๆ
6) .Message: เหตุการณ์ข้อความฝั่งเซิร์ฟเวอร์เดียวกัน
7). ทุกอย่าง: เหตุการณ์อะไรบนเซิร์ฟเวอร์เดียวกัน
8) .reconnect_failed: การเชื่อมต่อล้มเหลวอีกครั้ง
9). Reconnect: เชื่อมต่อได้สำเร็จ
10). Reconnecting: การเชื่อมต่อใหม่
ที่นี่เราต้องพูดถึงคำสั่งซื้อเมื่อซ็อกเก็ตไคลเอนต์เริ่มการเชื่อมต่อ เมื่อเชื่อมต่อการเชื่อมต่อครั้งแรกลำดับการทริกเกอร์เหตุการณ์คือ: เชื่อมต่อ-> เชื่อมต่อ; เมื่อการเชื่อมต่อสูญหายลำดับการทริกเกอร์เหตุการณ์คือ: disconnect-> การเชื่อมต่อใหม่ (อาจดำเนินการหลายครั้ง)-> Connecting-> reconnect-> Connect-> Connect
4. การอนุญาต
1). ออกอากาศไปยังลูกค้าทั้งหมด: socket.broadcast.emit ('ข้อความออกอากาศ');
2). เข้าห้อง (ใช้งานง่ายมาก! มันเทียบเท่ากับเนมสเปซซึ่งสามารถออกอากาศไปยังห้องที่เฉพาะเจาะจงโดยไม่ส่งผลกระทบต่อลูกค้าในห้องอื่นหรือไม่อยู่ในห้อง): socket.join ('ชื่อห้องของคุณ');
3). ข้อความออกอากาศไปยังห้อง (ผู้ส่งไม่สามารถรับข้อความ): socket.broadcast.to ('ชื่อห้องของคุณ'). ปล่อย ('ข้อความห้องพักออกอากาศ');
4). ข้อความออกอากาศไปยังห้อง (รวมถึงผู้ส่งสามารถรับข้อความได้) (API นี้เป็นของ io.sockets): io.sockets.in ('ชื่อห้องอื่น') emit ('ข้อความห้องพัก');
5). Force WebSocket Communication: (ไคลเอนต์) Socket.Send ('HI'), (เซิร์ฟเวอร์) ใช้ socket.on ('ข้อความ', ฟังก์ชั่น (ข้อมูล) {}) เพื่อรับ
นี่คือการแนะนำการใช้งานขั้นสูงของ socket.io โดยส่วนตัวแล้วฉันรู้สึกว่า API พื้นฐานเหล่านี้เพียงพอในการใช้งานประจำวันซึ่งสะท้อนให้เห็นถึงปรัชญาการออกแบบที่เรียบง่ายและใช้งานง่ายของ Socket.io บทความนี้เป็นเพียงวิธีที่จะดึงดูดความสนใจ เมื่อพบปัญหาที่ไม่สามารถแก้ไขได้ในการใช้งานจริงจะเป็นการดีกว่าที่จะตรวจสอบวิกิโดยละเอียดอย่างเป็นทางการ