Web sunucusundan tarayıcıya veri itmenin bir yolu var mı?


134

Tabii ki Ajax'ın farkındayım, ancak Ajax ile ilgili sorun, tarayıcının yeni veri olup olmadığını bulmak için sunucuyu sık sık yoklaması gerektiğidir. Bu sunucu yükünü artırır.

Sunucuyu sık sorgulamak dışında daha iyi bir yöntem (Ajax kullanarak bile) var mı?


1
Olduğundan emin değilim. Uygulama için kavramsal olarak daha basit hale getirmek için, yoklama taleplerinin üzerine bir taşıma katmanı uygulayabilir ve böylece yoklama sorumluluğunu uygulama mantığınızdan kaldırabilirsiniz. Belki birisi bunu zaten uyguladı? <strong> Düzenleme: </strong> Görünüşe göre <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> ters Ajax </a> ve <a href = " en.wikipedia.org/wiki/Comet_ ( programlama) "> Kuyruklu yıldız </ a >, ancak şu ana kadar bunu kendiniz uygulamanız gerekiyor gibi görünüyor. Bunun için bir JavaScript kütüphanesi var mı?
Anders Sandvig

1
@Rachel - Başkalarının ne yaptığını görebilmeniz için canlı güncellemeler. StackOverflow gibi siteler ve Google dokümanları gibi işbirliği için web uygulamaları için iyidir.
Itai Bar-Haim

1
2016'da bu tür bir şey yapan herkes muhtemelen bu tür iletişim için websockets'i daha iyi bir seçim olarak bulur.
Gölge

Yanıtlar:



37

Evet, Ters Ajax veya Comet denir . Kuyruklu yıldız temelde verileri bir web tarayıcısına gerçek zamanlı olarak aktarmak için uzun ömürlü HTTP isteklerini açmanın farklı yolları için bir şemsiye terimdir. StreamHub Push Server'ı öneririm , harika demoları var ve başlamak için diğer sunuculardan çok daha kolay. Check out Comet ve Streamhub Eğitimi Başlarken hızlı bir tanıtımın. Ücretsiz olarak indirilebilen ancak 20 eşzamanlı kullanıcıyla sınırlı olan Topluluk Sürümü'nü kullanabilirsiniz. Ticari sürüm, sadece destek için buna değer, ayrıca SSL ve Masaüstü .NET ve Java istemci adaptörleri alırsınız. Google Grup aracılığıyla yardım alabilirsiniz, internette iyi bir sürü öğretici var ve bir GWT Comet adaptörü de var.


1
Kesinlikle gidilecek yol, bir kez kendiniz uygulamaya başladığınızda, ne kadar olduğunu anlayacaksınız - yeniden bağlantı, uzun oylama, akış iframe'leri, çapraz tarayıcı desteği, HTTPS ...
Corehpf

2
Comet'in ne olduğuna dair bir açıklama bu cevaba yardımcı olacaktır
Kevin Monk

1
@Satir: Hızlı bir açıklama ekledi. Diğer yanıtların Wikipedia makalesine bağlantıları vardır.
Nosrama

32

Günümüzde WebSockets kullanmalısınız. HTTP ile bağlantıların başlatılmasına ve ardından iki yönlü istemci-sunucu ileti tabanlı iletişime yükseltilmesine izin veren 2011 standardıdır.

Javascript'ten bağlantıyı kolayca başlatabilirsiniz:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

Çok yönlü kullanım, tenchnology yığınınıza bağlıdır.



8
Tamamen katılıyorum ... İki yönlü iletişim için HTTP kullanmak, Mario'nun kaplumbağa kabuklarına atlamasını sağlamak için REST çağrılarını düşünmeye benziyor ... delilik. İstekler yapmak ve basit bir düğme insanları itmek için yanıt beklemek gerekmez .... Sadece yapmıyorsunuz. HTTP bir belge protokolüdür. Üstmetin transfer protokolü. Ajax Push, HTTP'yi WebSocket'in tasarım gereği yapması için atlatmanın inanılmaz derecede karmaşık bir yoludur. Aptal olmayı bırak ve iş için doğru aracı kullan.
Nick Steele

elipsleri ve bazen "ellipsos" diyeceğim dört noktadan oluşan yeni bir form!
imbatman

10

Temelde "ters Ajax" olan Comet'e (Ajax'ın bir temizlik maddesi olduğu ve Comet'in olduğu gerçeğine bir parodi) bakın. Bunun, her kullanıcının bildirim alması için uzun ömürlü bir sunucu bağlantısı gerektirdiğini unutmayın, bu nedenle uygulamanızı yazarken performansın etkilerine dikkat edin.

http://en.wikipedia.org/wiki/Comet_(programming)



5

Comet'e biraz zaman ayırmanızı şiddetle tavsiye ederim, ancak kullanabileceğiniz gerçek bir uygulama veya kütüphane bilmiyorum.

Canlı bir Callcenter için ajan ve çağrı kuyruğu durumunu güncellemeyi içeren bir web uygulamasının bir çeşit "callcenter kontrol paneli" için, çalışan ancak kullanabileceğiniz bir kitaplıktan uzak bir şirket içi çözüm geliştirdik.

Yaptığımız şey, sunucuya telefon sistemiyle konuşan, yeni olaylar bekleyen ve durumun fotoğrafını tutan küçük bir hizmet uygulamaktı. Bu hizmet küçük bir web sunucusu sağlar.

Web istemcilerimiz HTTP üzerinden bu web sunucusuna bağlanır ve son fotoğrafı (XML olarak kodlanır) ister, görüntüler ve sonra tekrar gider ve yeni fotoğrafı ister. Bu noktada web sunucusu şunları yapabilir:

  • Varsa yeni fotoğrafı iade edin
  • Bazı olayların gerçekleşmesini ve fotoğrafı değiştirmesini bekleyen istemciyi birkaç saniye (kurulumumuzda 30) engelleyin. Bu noktada hiçbir olay oluşturulmadıysa, istemcinin zaman aşımına uğramaması için yalnızca bağlantının canlı kalmasına izin vermek üzere aynı fotoğrafı döndürür.

Bu şekilde, istemciler yokladığında, en fazla 0 ila 30 saniye içinde yanıt alır. Yeni bir etkinlik zaten oluşturulduysa hemen alır), aksi takdirde yeni etkinlik oluşturulana kadar engeller.

Temelde yoklama, ancak web sunucusunu aşırı ısıtmamak için biraz akıllı yoklama. Comet cevabınız değilse, bunun aynı fikir kullanılarak ancak daha iyi sonuçlar için daha kapsamlı AJAX veya kodlama kullanılarak uygulanabileceğinden eminim. Bu AJAX öncesi çağda tasarlandı, bu yüzden iyileştirilmesi gereken çok şey var.

Birisi bunun gerçek bir hafif uygulamasını sağlayabilir, harika!


5

Comet'in ilginç bir alternatifi Flash'ta soket kullanmaktır.




2

Başka yöntemler de var. Durumunuzda "daha iyi" olup olmadığından emin değilim. Sayfa yüklendiğinde sunucuya bağlanan ve sunucu tarafından gönderilecek şeyleri bekleyen bir Java uygulamanız olabilir. Başlangıçta biraz daha yavaş olur, ancak tarayıcının yoklama olmadan seyrek olarak sunucudan veri almasına izin verir.


2

Sunucu tarafında BlazeDS veya LiveCycle ile istemcide bir Flash / Flex uygulaması kullanabilirsiniz. Veriler bir RTMP bağlantısı kullanılarak istemciye iletilebilir. RTMP'nin standart olmayan bir bağlantı noktası kullandığını unutmayın. Ancak bağlantı noktası engellendiyse, yoklamaya kolayca geri dönebilirsiniz.


2

Kalıcı http bağlantılarını kullanarak hedeflediğiniz şeyi elde etmek mümkündür.

Check out Comet makalesine başlamak için iyi bir yerdir Vikipedi üzerinde.

Çok fazla bilgi sağlamıyorsunuz, ancak bir tür etkinlik güdümlü site (a'la digg casus) veya bunun gibi bir şey oluşturmaya çalışıyorsanız, muhtemelen bağlantının hiçbir zaman kapanmadığı bir URL'dir ve güncellemeleri gerçekleştirmek için komut dosyası etiketlerini sunucudan istemciye iletirsiniz.



1

Bir bağlantı sunucuya açıldıktan sonra açık tutulabilir ve sunucu uzun süre önce kullanarak yaptım içeriği itebilirsiniz multipart/x-mixed-replaceama bu IE'de işe yaramadı.

Değişmeyen üstbilgiler içerik göndermeyerek ama bağlantıyı açık bırakarak itme gibi çalışmasını sağlayan yoklama ile akıllıca şeyler yapabileceğinizi düşünüyorum ama bunu hiç yapmadım.





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.