2012-02-14 23 views
8

İstemci ve sunucu arasında bir web bağlantısı aracılığıyla bağlantı kurmak için nodejs + websocket modülünü kullanıyorum. Sunucu, istemciye birkaç kez veri yayar: Bu bir TCP bağlantısı olduğunu biliyorum, ancak bu konuda her türlü şüpheyi silmeme izin verin. "Emits" ardışık mı? İlk "yayımı" 1sn'de yapıldıysa ve ikincisi 2s'de "yayar" olsaydı, müşteri ilk salımı ve sonra ikincisini alır mı? İlk yayının henüz alınmaması ve ikincisinin gönderilmesi durumunda ne olur? Aramalar engelleniyor mu?Websocket: sunucu verileri senkronize olarak mı gönderiliyor?

+0

http://stackoverflow.com/q/11804721/632951 – Pacerier

cevap

21

WebSockets TCP üzerinde yerleşiktir. TCP, paketlerin teslimatını ve siparişini garanti eder. Buna ek olarak, TCP'den farklı olarak, WebSockets mesaj tabanlı bir mesajdır. Bu, WebSocket mesajlarının tüm mesaj olarak alındığı anlamına gelir (TCP akışı ve 'mesajlar' dinleyicinin perspektifinden parçalara bölünebilir)

node.js'de iki adet Aynı bağlamdan (aynı işlevden) biri diğerinden sonra bu sırayla teslim edilecektir. Ancak, yayılımlarınız iki farklı geri aramada ise, Node.js'nin bu geri çağrıları ne zaman planlayacağını ve böylece zamanlanan geri aramaların yeniden sipariş vermesi nedeniyle emirlerin yeniden sipariş verileceğini garanti edemezsiniz.

Güncelleme:

fs.readFile(file1,function(e,data) { ws.send(data); }); 
fs.readFile(file2,function(e,data) { ws.send(data); }); 

sırası: Burada

node.js olay güdümlü doğa WebSocket'e şaşırtıcı yeniden düzenlenmesi ile sonuçlanabilir neden genişletmek için bir örnektir/gönderir yayar Bu dosya1 ve dosya2 tarayıcıya iletilemez öngörülebilir değildir (dosya boyutu bile önbelleğe alma, dosya sistemi parçalanması, vb gibi şeyler nedeniyle ateş edecek bir garanti değildir). Dosya2'nin readFile değeri bir setTimeout kullanılarak 1 saniye sonra çağrılmış olsa bile, tarayıcı yine de bunları düzgün bir şekilde alabilir (örneğin, dosya1 çok daha büyükse ve 3 saniye sonra okursa dosya1 gönderildikten sonra dosya1 gönderilir) .

Evet, emer/gönderimler, tarayıcıda Node.js'de çağrıldıkları sırayla alınacak, ancak Node.js'nin eşzamansız olaya bağlı yapısı nedeniyle, emir/gönderimler sizin siparişinizde gerçekleşmeyebilir. bekliyoruz.

Node.js'nin eşzamansız olaya dayalı yapısı, Node.js'nin mükemmel verim ve performansına olanak veren şeydir, ancak bu tür geri çağırma tabanlı programlama için kullanılmazsa, bazı şaşırtıcı sonuçlara sahip olabilir.

+0

"Ancak, yaymalarınız iki farklı geri aramada bulunuyorsa, Node.js'nin bu geri çağrıları zamanlayacağı zaman garanti veremezsiniz ve böylece zamanlanan geri çağrılar yeniden sipariş verildiğinden yayının yeniden sıralanmasını sağlayabilirsiniz." - geri arama 1, geri arama 2'den önce çaldıysa ve her biri yayarsa, geri arama 1 'emrimi *, geri çağırma 2'nin yayınlanmasından önce çalışır. – einaros

+1

@einaros, bu doğru, ama benim amacım, geri çağırmaların doğal olarak asenkron olmalarıdır. Geri arama B'yi kaydetmeden önce A 1 saniye geri çağırırsanız, geri arama A ile rutin tamamlanması 3 saniye sürüyorsa ve B sadece 1 saniye sürüyorsa, önce A önce A olsa bile B önce A olacaktır. G/Ç tamamlama işlemine devam eden tüm geri bildirimler genellikle öngörülemeyen zamanlamaya sahip olacaktır. – kanaka

+0

Belirli bir olay için belirli bir sırada kaydedilen geri çağrıların her zaman bu sırayla yürütüldüğünü göz önünde bulundurarak, geri kalanların herhangi birinin OP'nin sorusuyla nasıl bir ilişki içinde olduğunu göremiyorum. Emisyonları tetikleyen olaylar düzeni değiştirirse; Emisyonlar da düzeni değiştirecek. – einaros

4

İletiler istemcideki doğru sırada gelir.

+2

Peki "doğru düzen" nedir? Eğer iki işlem ** simultane bir şekilde ** 1 nanoscond versiyse, sunucu bu sırayla çağrıları alıyor mu? – Pacerier

+3

@Pacerier Sorunuz, terimlerle bir çelişkiyi somutlaştırmaktadır. – EJP

İlgili konular