2009-01-26 19 views
11

C# .Net ve Socket sınıfını System.Net.Sockets ad alanından kullanıyorum. Eşzamansız alma yöntemlerini kullanıyorum. Bunun bir web servisi gibi bir şeyle daha kolay bir şekilde yapılabileceğini anlıyorum; Bu soru pratik bir ihtiyaçtan ziyade benim merakımdan kaynaklanıyor.C# akış tüm verileri aldı?

Soruma sorum: istemcinin bilinmeyen bir uzunluğa sahip ikili seri hale getirilmiş bir nesne göndermesi olduğunu varsayalım. Sunucumun soketinde, tüm nesnenin alındığını ve serileştirmeye hazır olduğunu nasıl bilebilirim? Nesnenin bayt cinsinden uzunluğunu nesneyle hazırlamayı düşündüm, ancak bu .Net dünyasında gereksiz görünüyor. Nesne arabellekten daha büyükse ne olur? "Nesne çok büyük olduğu için arabayı yeniden boyutlandırmalıyım" nasıl bilebilirim?

cevap

11

Ya (etkin XML gibi - Eğer kök öğeyi kapattığında bir XML belgesi alma bittiğinde geçirdiğimizde bunu size) kendini sonlandırma olması protokolü ihtiyaç veya uzunluğu-önek gerekir Veri, veya, bittiğinde akışı kapatmak için diğer ucuna ihtiyacınız vardır.

Kendiliğinden sonlandırılmış bir protokol durumunda, okuma kodunun bittiğini anlayabilmesi için yeterince kancaya sahip olmanız gerekir. İkili serileştirme ile yeterli sayıda kancaya sahip olmayabilirsiniz. Uzunluk öneki, burada en kolay çözümdür.

4

Saf soketler kullanıyorsanız, uzunluğu bilmeniz gerekir. Aksi halde, tamponun boyutu uygun değildir, çünkü tüm verilerin büyüklüğüne sahip bir tamponunuz olsa bile, yine de hepsini okumayabilir - Stream.Read yöntemini kontrol edin, gerçekte okunan ısırıkların nr değerini döndürür. Böylece tüm veriler alınana kadar döngü yapmanız gerekir.

0

Evet, tüm baytları çözene kadar seri hale getirilmeyeceksin.