พุชข้อมูลจากเซิร์ฟเวอร์ไปยังไคลเอนต์โดยไม่มีคำขอของลูกค้าหรือไม่


11

ฉันสังเกตเห็นขณะเรียกดู Stack Exchange ว่ามีการแจ้งเตือนแบบไดนามิกเช่น "3 ข้อความใหม่คลิกเพื่อแสดง" ฉันต้องการอัพเดตแบบไดนามิกเช่นนี้สำหรับสิ่งที่ฉันจะอธิบาย

สมมติว่าฉันต้องการสร้างภาพหมุน / สไลด์โชว์จาก 10 บทความข่าวล่าสุด ฉันต้องการให้ม้าหมุนนี้ได้รับการอัพเดททุกชั่วโมงในคิว บทความใหม่จะส่งบทความเก่าออกจากคิว ทางออกจากหัวของฉันจะเป็น

  1. ผู้ใช้ล็อกออนเข้าสู่ไคลเอนต์
  2. ลูกค้าคำนวณจำนวนนาทีจนกระทั่งเครื่องหมายชั่วโมงถัดไปและตั้งค่าตัวจับเวลาเพื่อดำเนินการที่ชั่วโมง
  3. ที่เครื่องหมายชั่วโมงให้ส่งคำขอไปยังเซิร์ฟเวอร์เกี่ยวกับบทความข่าวใหม่ๆที่ยังไม่ได้อยู่ในภาพหมุน
  4. จัดการกับการตอบสนอง
  5. รีเซ็ตตัวจับเวลา

นี่เป็นกลยุทธ์ที่ยอมรับได้หรือไม่? ฉันสามารถทำได้โดยไม่ต้องพึ่งพาคำขอของลูกค้าหรือไม่ ในคำอื่น ๆ Stack Exchange บรรลุการปรับปรุงแบบไดนามิกได้อย่างไร


4
ดูที่ SignalR
Robert Harvey

ฉันแนะนำให้คุณอ่านไอเดียRSSและAJAX RSS เป็นตัวอย่างของโปรโตคอลมาตรฐานสำหรับฟีดการสมัครสมาชิกและ AJAX เป็นแนวคิดระดับสูงสำหรับวิธีการอัปเดตไคลเอ็นต์ (เบราว์เซอร์) โดยไม่ต้องโหลดหน้าซ้ำ ฉันพนันได้เลยว่านี่เป็นวิธีการแลกเปลี่ยนแบบสแต็ค

1
@Snowman Stack Exchange ใช้WebSocket ดูmeta.stackexchange.com/questions/10369/…
Robert Harvey

ไคลเอนต์เป็นเบราว์เซอร์ไคลเอ็นต์ที่กำหนดเองหรืออย่างอื่นหรือไม่
outis

มันค่อนข้างจะเป็นศัตรูกับผู้ใช้ แต่คุณสามารถให้หน้า HTML รีเฟรชตัวเองทุก ๆ 15 นาที หน้าเว็บข่าวส่วนใหญ่ทำเช่นนี้
Gilbert Le Blanc

คำตอบ:


7

ในการผลักดันข้อมูลคุณจะต้องระบุลูกค้าและจะต้องดำเนินการโดยสมัครสมาชิกไคลเอนต์ไปยังเซิร์ฟเวอร์ เมื่อเสร็จแล้วคุณจะมีรายชื่อลูกค้าที่สมัครเป็นสมาชิกด้วยการเชื่อมต่อแบบถาวร

ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุฉันจะบอกว่ามันเป็นการดีที่สุดสำหรับลูกค้าที่จะร้องขอไปยังเซิร์ฟเวอร์เพื่อให้คุณไม่จำเป็นต้องรักษาการเชื่อมต่อแบบถาวรและใช้โปรโตคอลการสื่อสารคำขอ / ตอบสนองเป็น HTTP

ตัวอย่างหนึ่งที่คำนึงถึงการรักษาการเชื่อมต่ออย่างต่อเนื่องคือระบบแชทสด / การส่งข้อความทันทีเนื่องจากการสื่อสารควรเกิดขึ้นแบบเรียลไทม์

โปรดจำไว้ว่าการเชื่อมต่อแบบถาวรนั้นมักจะนำมาใช้ผ่านการใช้งานsocketsซึ่งเพิ่มการซ้อนทับในการใช้โปรโตคอลการสื่อสารการเข้ารหัส ฯลฯ


2

โดยทั่วไปคุณต้องส่งข้อมูลไปยังไคลเอนต์และเนื่องจากการสื่อสารแบบสองทิศทางไม่ได้อยู่ในขอบเขตของโปรโตคอล http จึงไม่ใช่เรื่องง่ายเลยที่จะใช้งานด้วยตัวคุณเอง

ทางออกของปัญหาของคุณคือsocket.io

ตามที่เว็บไซต์ระบุ

"Socket.IO เปิดใช้งานการสื่อสารตามเหตุการณ์แบบสองทิศทางแบบเรียลไทม์ซึ่งทำงานได้กับทุกแพลตฟอร์มเบราว์เซอร์หรืออุปกรณ์โดยเน้นความน่าเชื่อถือและความเร็วเท่ากัน"

หวังว่านี่จะช่วยแก้ปัญหาของคุณได้


7
มันจะมีประโยชน์ถ้าคุณระบุว่าคุณมีส่วนเกี่ยวข้องกับ socket.io อย่างไรและจะช่วยแก้ปัญหาผู้ถามตามความรู้ / ประสบการณ์ของคุณกับกรอบงานได้อย่างไร (ตรงกันข้ามกับ "พันธกิจ" ของเว็บไซต์)
Benni

WebSockets เป็นที่ต้องการอย่างสูงสำหรับ Socket.IO ในขณะนี้ที่เบราว์เซอร์หลักทั้งหมดใช้มาตรฐาน ภาษาหลักส่วนใหญ่มีการใช้งาน websocket แต่ไม่ใช่ภาษา socket.io Socket.io เพิ่มโครงสร้างเพิ่มเติมให้กับข้อความดังนั้นจึงไม่เข้ากันได้อย่างง่ายดายเช่นกัน
อเล็กซ์ Reinking

1

ฉันไม่สามารถพูดได้ว่า SE ทำอย่างไรแม้ว่าจะเป็นเว็บไซต์มีหลายวิธีที่พวกเขาสามารถทำได้ซึ่งรวมถึงชุด cron job เพื่อเรียกใช้สคริปต์ php / asp / what-have-you ในชั่วโมงเพื่อผลักดันข้อมูล แต่นี่จะเป็นถ้าคุณกำลังมองหาวิธีแก้ปัญหาเว็บเท่านั้น

แต่เนื่องจากคุณกำลังพูดถึงไคลเอนต์คุณอาจสร้างไฟล์ด้วยวันที่ / เวลาของการอัพเดทข่าวล่าสุดไปยังไคลเอนต์นั้นและให้ลูกค้าตรวจสอบค่าที่เก็บไว้ในไฟล์ดังกล่าวและเปรียบเทียบกับเวลาของระบบของผู้ใช้เพื่อดูว่าชั่วโมง ได้ผ่านไปตั้งแต่การอัปเดตครั้งล่าสุด หากใช้เวลาอย่างน้อยหนึ่งชั่วโมงลูกค้าจะร้องขอกระแสข่าวล่าสุดจากเซิร์ฟเวอร์ของคุณซึ่งจะส่งคืนกระแสข่าวล่าสุดให้กับลูกค้า

ฉันจะหลีกเลี่ยงการใช้ตัวจับเวลาหรืออย่างน้อยก็ใช้ตัวจับเวลาเพียงอย่างเดียวเนื่องจากวิธีการนั้นจะทำงานได้ก็ต่อเมื่อผู้ใช้เปิดไคลเอ็นต์ไว้เพื่อให้ตัวจับเวลาทำงานต่อไป แต่ถ้าคุณมีไฟล์ตามที่ฉันแนะนำคุณสามารถสร้างรูทีนย่อยเพื่อเปิดไฟล์เก็บเวลาไว้ในตัวแปรแล้วเปรียบเทียบกับเวลาของระบบและทำการร้องขอถ้ามันใช้เวลาอย่างน้อยหนึ่งชั่วโมง จากนั้นคุณเพียงโทรไปที่หัวข้อย่อยที่เกี่ยวข้องกับเหตุการณ์บางอย่าง ฉันจะเรียกมันอย่างแน่นอนในแบบฟอร์มการโหลดเพราะหากผู้ใช้เพิ่งรีสตาร์ทไคลเอนต์ของพวกเขาแล้วคุณต้องการข่าวล่าสุด หากไม่กี่วันนับตั้งแต่พวกเขาอยู่ในไคลเอนต์ก็จะแสดงข่าวที่เก่า ในการผูกอย่างน้อยย่อยให้ลูกค้าโหลดและเริ่มจับเวลาตามที่คุณแนะนำ

ฉันขอโทษถ้าฉันเข้าใจผิดว่าคุณกำลังทำอะไรเพราะฉันไม่แน่ใจว่าคุณจะทำอะไร แต่หวังว่าทั้งสองวิธีจะมีของมีค่าสำหรับคุณ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.