İstemci isteği olmadan sunucudan istemciye veri aktarılıyor mu?


11

Stack Exchange'e göz atarken "3 yeni mesaj, göstermek için tıklayın" gibi dinamik bildirimler olduğunu fark ettim. Açıklamak üzere olduğum şeyler için bu tür bir dinamik güncellemeye sahip olmak istiyorum.

Diyelim ki son 10 haber makalesinden oluşan bir atlıkarınca / slayt gösterisi oluşturmak istiyorum. Bu karuselin saatte bir sırada güncellenmesini istiyorum. Daha yeni makaleler eski makaleleri kuyruğun dışına itecektir. Başımın üstündeki çözüm olurdu.

  1. Kullanıcı istemcide oturum açar.
  2. İstemci sonraki saat işaretine kadar olan dakika sayısını hesaplar ve saatte çalışacak bir zamanlayıcı ayarlar.
  3. Saatte, daha önce karuselde bulunmayan yeni haber makaleleri hakkında sunucuya bir istek gönderin .
  4. Yanıtı ele alın.
  5. Zamanlayıcıyı sıfırla.

Bu kabul edilebilir bir strateji mi? Müşteri taleplerine dayanmadan bunu başarabilir miyim? Başka bir deyişle Stack Exchange dinamik güncellemesini nasıl elde eder?


4
SignalR'a bir göz atın.
Robert Harvey

Fikirler için RSS ve AJAX'ta okumanızı tavsiye ederim . RSS, abonelik özet akışları için standart bir protokole örnektir ve AJAX, sayfayı yeniden yüklemeden bir istemciyi (tarayıcı) nasıl güncelleyeceğiniz konusunda üst düzey bir kavramdır. Bahse girerim, Stack Exchange böyle çalışır.

1
@Snowman Stack Exchange WebSocket kullanır . Bkz. Meta.stackexchange.com/questions/10369/…
Robert Harvey

İstemci bir tarayıcı mı, özel bir istemci mi yoksa başka bir şey mi?
outis

Bu biraz kullanıcı saldırısı, ancak HTML sayfasının her 15 dakikada bir kendini yenilemesini sağlayabilirsiniz. Çoğu haber web sayfası bunu yapar.
Gilbert Le Blanc

Yanıtlar:


7

Verileri iletmek için bir İstemci tanımlamanız gerekir ve bu istemciyi sunucuya abone olarak yapılır. Bu yapıldıktan sonra, kalıcı bağlantıya sahip abone bir müşterinizin bir listesi olacaktır.

Neyi başarmak istediğinize bağlı olarak, istemcinin sunucuya istemesinin en iyisi olduğunu söyleyebilirim, böylece kalıcı bir bağlantı sürdürmek ve HTTP olarak istek / yanıt iletişim protokollerini kullanmak zorunda kalmazsınız.

Kalıcı bir bağlantı sağlamak için akla gelen bir örnek, iletişimin gerçek zamanlı olması gerektiği için canlı sohbet / anlık mesajlaşma sistemi olacaktır.

Kalıcı bağlantı genellikle socketskendi iletişim protokolünüzü, şifrelemenizi vb.


2

Temel olarak verileri istemciye aktarmanız gerekir ve çift yönlü iletişim http protokolü kapsamında olmadığından, kendi başınıza uygulamak kolay değildir.

Sorununuzun çözümü socket.io

Web sitesinde belirtildiği gibi,

"Socket.IO, gerçek zamanlı çift yönlü olay tabanlı iletişim sağlar. Her platformda, tarayıcıda veya cihazda eşit derecede güvenilirlik ve hıza odaklanarak çalışır."

Umarım bu sorununuzu çözecektir.


7
Socket.io ile ilişkili olup olmadığınızı ve nasıl olduğunuzu ve bunun, web sitesindeki yalnızca "misyon bildirisinin" aksine) bilgi / deneyiminizi temel alarak soru sorucularının çözümüne nasıl yardımcı olacağını belirtmeniz yararlı olacaktır.
Benni

WebSockets, tüm büyük tarayıcılar standardı uyguladığı için Socket.IO'ya kesinlikle tercih edilir. Büyük dillerin çoğunda websocket uygulamaları vardır, ancak socket.io olanları yoktur. Socket.io, iletilere ek yapı ekler, bu nedenle de kolayca uyumlu değildir.
Alex

1

Her ne kadar bir web sitesi olduğu için bu veri itmek için bir php / asp / what-have-you komut dosyası çalıştırmak için ayarlanmış bir cron iş içerebilir çeşitli yollar vardır SE nasıl konuşamıyor. Ama bu sadece web için bir çözüm arıyorsanız olurdu.

Ancak bir istemciden bahsettiğinizden, belki o istemciye en son haber güncellemesinin tarih / saatini içeren bir dosya oluşturabilir ve istemcinin söz konusu dosyada depolanan değeri kontrol etmesini ve bir saatin olup olmadığını görmek için kullanıcının sistem saatiyle karşılaştırabilirsiniz. son güncellemeden bu yana geçti. En az bir saat geçtiyse, istemci sunucunuzdan en son haber akışını ister ve bu da en son haber akışını istemciye döndürür.

Bir zamanlayıcı kullanmaktan ya da en azından bir zamanlayıcıyı kullanmaktan kaçınırım çünkü bu yöntem yalnızca kullanıcı zamanlayıcıyı çalışır durumda tutmak için açık tutarsa ​​çalışır. Ancak (ayrıca) önerdiğim gibi bir dosyaya sahipseniz, dosyayı açmak için bir alt program oluşturabilir, zamanı bir değişkene depolayabilir ve sistem saatiyle karşılaştırabilir ve en az bir saat olmuşsa isteği yapabilirsiniz. Sonra sadece belirli olaylarla ilgili olarak alt çağrıyı yaparsınız. Kesinlikle form yükü olarak adlandırırdım çünkü kullanıcı sadece müşterilerini yeniden başlatıyorsa en son haberleri istersiniz. Eğer müşteri olduklarından birkaç gün geçmiş olsaydı o zaman eski haberleri gösterirdi. En azından o alt istemciyi yükleyin ve önerdiğiniz gibi zamanlayıcıyı başlatın.

Ne istediğini tam olarak bilmediğim için ne istediğini yanlış anladıysam özür dilerim. Ama umarım her iki şekilde de burada sizin için değerli bir şey vardır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.