คำตอบที่ดีบางอย่างจากผู้อื่นซึ่งครอบคลุมพื้นที่มากมาย นี่เป็นข้อมูลเพิ่มเติมเล็กน้อย
ข้อได้เปรียบประการเดียวของ WebSockets ที่มีต่อปลั๊กอินเช่น Java Applets, Flash หรือ Silverlight คือ WebSockets ถูกสร้างขึ้นในเบราว์เซอร์และไม่ต้องพึ่งพาปลั๊กอิน
หากเป็นเช่นนี้คุณหมายความว่าคุณสามารถใช้ Java Applets, Flash หรือ Silverlight เพื่อสร้างการเชื่อมต่อซ็อกเก็ตใช่นั่นเป็นไปได้ อย่างไรก็ตามคุณไม่เห็นว่ามีการใช้งานในโลกแห่งความเป็นจริงบ่อยเกินไปเนื่องจากข้อ จำกัด
ตัวอย่างเช่นตัวกลางสามารถและปิดการรับส่งข้อมูลนั้นได้ มาตรฐาน WebSocket ได้รับการออกแบบมาเพื่อให้เข้ากันได้กับโครงสร้างพื้นฐาน HTTP ที่มีอยู่ดังนั้นจึงมีแนวโน้มที่จะถูกแทรกแซงจากตัวกลางเช่นไฟร์วอลล์และพร็อกซีน้อยกว่ามาก
นอกจากนี้ WebSocket ยังสามารถใช้พอร์ต 80 และ 443 ได้โดยไม่ต้องใช้พอร์ตเฉพาะอีกครั้งด้วยการออกแบบโปรโตคอลให้เข้ากันได้กับโครงสร้างพื้นฐาน HTTP ที่มีอยู่ให้มากที่สุด
ทางเลือกของซ็อกเก็ตเหล่านั้น (Java, Flash และ Silverlight) ยากที่จะใช้อย่างปลอดภัยในสถาปัตยกรรมข้ามแหล่งกำเนิด ดังนั้นผู้คนที่พยายามใช้สิ่งเหล่านี้ข้ามแหล่งกำเนิดมักจะทนต่อความไม่ปลอดภัยมากกว่าที่จะพยายามทำอย่างปลอดภัย
นอกจากนี้ยังสามารถกำหนดให้เปิดพอร์ต "ที่ไม่ได้มาตรฐาน" เพิ่มเติมได้ (สิ่งที่ผู้ดูแลระบบไม่อยากทำ) หรือไฟล์นโยบายที่ต้องจัดการ
ในระยะสั้นการใช้ Java, Flash หรือ Silverlight สำหรับการเชื่อมต่อซ็อกเก็ตนั้นมีปัญหามากพอที่คุณจะไม่เห็นว่ามีการใช้งานในสถาปัตยกรรมที่จริงจังบ่อยเกินไป Flash และ Java มีความสามารถนี้มาแล้วอย่างน้อย 10 ปี แต่ยังไม่แพร่หลาย
มาตรฐาน WebSocket สามารถเริ่มต้นด้วยแนวทางใหม่โดยคำนึงถึงข้อ จำกัด เหล่านั้นและหวังว่าจะได้เรียนรู้บทเรียนจากพวกเขา
การใช้งาน WebSocket บางอย่างใช้ Flash (หรืออาจเป็น Silverlight และ / หรือ Java) เป็นทางเลือกเมื่อไม่สามารถสร้างการเชื่อมต่อ WebSocket ได้ (เช่นเมื่อทำงานในเบราว์เซอร์เก่าหรือเมื่อตัวกลางรบกวน)
แม้ว่ากลยุทธ์ทางเลือกบางประเภทสำหรับสถานการณ์เหล่านั้นจะฉลาด แต่ก็จำเป็น แต่ส่วนใหญ่ที่ใช้ Flash และคณะจะประสบกับข้อเสียที่อธิบายไว้ข้างต้น ไม่จำเป็นต้องเป็นอย่างนั้น - มีวิธีแก้ปัญหาเพื่อให้ได้การเชื่อมต่อข้ามแหล่งที่มาที่ปลอดภัยโดยใช้ Flash, Silverlight เป็นต้น แต่การใช้งานส่วนใหญ่จะไม่ทำเช่นนั้นเพราะไม่ใช่เรื่องง่าย
ตัวอย่างเช่นหากคุณใช้ WebSocket สำหรับการเชื่อมต่อข้ามแหล่งที่มาก็จะทำงานได้ดี แต่ถ้าคุณเรียกใช้ในเบราว์เซอร์รุ่นเก่าหรือไฟร์วอลล์ / พร็อกซีรบกวนและพึ่งพา Flash กล่าวว่าในฐานะทางเลือกของคุณคุณจะพบว่าการเชื่อมต่อข้ามแหล่งกำเนิดเดียวกันนั้นทำได้ยาก เว้นแต่คุณจะไม่สนใจเรื่องความปลอดภัยแน่นอน
นั่นหมายความว่าเป็นเรื่องยากที่จะมีสถาปัตยกรรมแบบรวมเดียวที่ใช้งานได้กับการเชื่อมต่อแบบเนทีฟและไม่ใช่เนทีฟเว้นแต่คุณจะเตรียมพร้อมที่จะทำงานสักหน่อยหรือไปกับกรอบงานที่ทำได้ดี ในสถาปัตยกรรมในอุดมคติคุณจะไม่สังเกตเห็นว่าการเชื่อมต่อเป็นแบบดั้งเดิมหรือไม่ การตั้งค่าความปลอดภัยของคุณจะใช้ได้ทั้งสองกรณี การตั้งค่าคลัสเตอร์ของคุณจะยังคงใช้งานได้ การวางแผนกำลังการผลิตของคุณยังคงมีอยู่ และอื่น ๆ
ข้อดีอย่างเดียวของ WebSockets ผ่านการสตรีม http คือคุณไม่ต้องพยายาม "ทำความเข้าใจ" และแยกวิเคราะห์ข้อมูลที่ได้รับ
ไม่ง่ายเหมือนการเปิดสตรีม HTTP และนั่งสำรองขณะที่ข้อมูลของคุณไหลเป็นนาทีชั่วโมงหรือนานกว่านั้น ลูกค้าที่แตกต่างกันมีพฤติกรรมที่แตกต่างกันและคุณต้องจัดการสิ่งนั้น ตัวอย่างเช่นไคลเอนต์บางรายจะทำการบัฟเฟอร์ข้อมูลและไม่ปล่อยข้อมูลไปยังแอปพลิเคชันจนกว่าจะมีคุณสมบัติตรงตามเกณฑ์ ที่แย่กว่านั้นคือบางส่วนจะไม่ส่งข้อมูลไปยังแอปพลิเคชันจนกว่าจะปิดการเชื่อมต่อ
ดังนั้นหากคุณส่งข้อความหลายข้อความไปยังไคลเอนต์อาจเป็นไปได้ว่าแอปพลิเคชันไคลเอนต์จะไม่ได้รับข้อมูลจนกว่าจะได้รับข้อความมูลค่า 50 ข้อความเป็นต้น นั่นไม่ใช่แบบเรียลไทม์เกินไป
แม้ว่าการสตรีม HTTP อาจเป็นทางเลือกที่ดีเมื่อไม่มี WebSocket แต่ก็ไม่ใช่ยาครอบจักรวาล จำเป็นต้องมีความเข้าใจที่ดีในการทำงานอย่างมีประสิทธิภาพในพื้นที่เลวร้ายของเว็บในสภาพโลกแห่งความเป็นจริง
มีความแตกต่างที่สำคัญอื่น ๆ ที่ฉันขาดหายไปหรือไม่?
ยังมีอีกสิ่งหนึ่งที่ยังไม่มีใครพูดถึงฉันจะนำมากล่าว
โปรโตคอล WebSocket ได้รับการออกแบบให้เป็นเลเยอร์การขนส่งสำหรับโปรโตคอลระดับสูง แม้ว่าคุณจะสามารถส่งข้อความ JSON หรือสิ่งที่ไม่ได้โดยตรงผ่านการเชื่อมต่อ WebSocket แต่ก็ยังสามารถใช้โปรโตคอลมาตรฐานหรือแบบกำหนดเองได้
ตัวอย่างเช่นคุณสามารถทำ AMQP หรือ XMPP ผ่าน WebSocket ได้ตามที่ผู้คนเคยทำมาแล้ว ดังนั้นลูกค้าสามารถรับข้อความจากนายหน้า AMQP ราวกับว่ามันเชื่อมต่อโดยตรงกับนายหน้าเอง (และในบางกรณีก็เป็นเช่นนั้น)
หรือถ้าคุณมีเซิร์ฟเวอร์ที่มีโปรโตคอลที่กำหนดเองอยู่แล้วคุณสามารถส่งผ่าน WebSocket ได้ซึ่งจะขยายเซิร์ฟเวอร์ส่วนหลังนั้นไปยังเว็บ บ่อยครั้งที่แอปพลิเคชันที่มีอยู่ซึ่งถูกล็อคไว้ในองค์กรสามารถขยายการเข้าถึงได้โดยใช้ WebSocket โดยไม่ต้องเปลี่ยนโครงสร้างพื้นฐานส่วนหลังใด ๆ
(โดยปกติแล้วคุณต้องการที่จะทำทุกอย่างได้อย่างปลอดภัยดังนั้นโปรดตรวจสอบกับผู้ขายหรือผู้ให้บริการ WebSocket)
บางคนเรียก WebSocket ว่า TCP สำหรับเว็บ เนื่องจากเช่นเดียวกับ TCP ขนส่งโปรโตคอลระดับสูงขึ้น WebSocket ก็เช่นกัน แต่เป็นวิธีที่เข้ากันได้กับโครงสร้างพื้นฐานของเว็บ
ดังนั้นในขณะที่ส่งข้อความ JSON (หรืออะไรก็ได้) โดยตรงผ่าน WebSocket จึงเป็นไปได้เสมอเราควรพิจารณาโปรโตคอลที่มีอยู่ด้วย เพราะสำหรับหลาย ๆ สิ่งที่คุณต้องการทำอาจมีโปรโตคอลที่คิดไว้แล้วว่าจะทำ
ฉันขอโทษถ้าฉันถามซ้ำหรือรวมคำถามหลายข้อใน SO ไว้เป็นคำถามเดียว แต่ฉันแค่ต้องการให้ข้อมูลทั้งหมดที่มีอยู่ใน SO และเว็บเกี่ยวกับแนวคิดเหล่านี้เข้าใจได้อย่างสมบูรณ์แบบ
นี่เป็นคำถามที่ดีมากและคำตอบทั้งหมดให้ข้อมูลมาก!