2011-07-02 8 views
16

Özel bir FTP kitaplığı kullandığım bir C# uygulamasına sahibim. Şu anda veri göndermek için Socket.Send kullanıyorum ama bir NetworkStream soket ile başlatmak ve bunun yerine NetworkStream.Write kullanmak daha iyi olacağını merak ediyorum.NetworkStream.Write vs. Socket.Send

Biri diğerinin üzerinde kullanmanın avantajları var mı?

cevap

25

NetworkStream'un avantajı, öncelikle bir Stream olmasıdır. Socket'un dezavantajı, Stream gibi soyut I/O kaynaklarından okuyan ve yazan ortak kodun bir Socket işleyememesidir.

bir NetworkStream ana kullanım durumu size okur ya da Stream yazar başka bir yerde bazı koduna sahip olması ve size Socket ile kullanmak isterdim. Bu durumda olup olmadığını ve daha sonra NetworkStream'un büyük bir yardım olacağını biliyorsunuzdur! Örneğin, bir iletişim kitaplığınız vardı ve dosyalardan, adlandırılmış yöneltmelerden ve TCP/IP'den seri hale getirme mesajlarını desteklediniz. G/Ç sınıfı için ideal seçim Stream olacaktır. Ardından seri hale getirme yöntemleriniz FileStream, PipeStream veya NetworkStream kabul edebilir. Hatta bir MemoryStream kabul eder. İşte bu akışın ne tür bilmeden soyutlama biz akışı oluşturduktan sonra, bir yöntem onunla etkileşime nedeniyle faydadır. Bu anlamda

, bir NetworkStream adaptör tasarım deseni kullanır. Socket API'sini Stream API'sine uyarlar, böylece Stream beklediğiniz istemciler bunu kullanabilir.

Son olarak, NetworkStream, Socket için Stream bağdaştırıcısıysa, hangisini kullanmalıyız? 'a bir Stream gerekiyorsa, NetworkStream tek seçeneğinizdir. Bir Stream'a ihtiyacınız yoksa, hangisinin daha rahat olduğunu API ile kullanabilirsiniz. Zaten Socket kullanıyorsanız, NetworkStream'a geçmek için herhangi bir neden yoktur.

+0

Sadece buna ek olarak NetworkStream'in çok daha iyi uyumsuz desteğe sahip olduğunu ekleyebilir miyim –

+0

@LukeMcGregor Bu doğru değil. "NetworkStream", Görev tabanlı async desteğini doğrudan uygulamıyor, bunun yerine, "Yerel" görev tabanlı async ("TaskFactory.FromAsync" işlevini kullanıyor) olarak ideal olan Stream'in kendi APM-Görev işlevine dayanıyor '). Ayrıca, 'BeginRead' /' BeginWrite' (APM) metotları, basitçe, (karışık olarak adlandırılan, Görev-olmayan) Socket gibi yüksek performanslı olmayan 'Socket.BeginReceive' /' Socket.BeginSend'ı da sarmaktadır. SendAsync' ve 'Socket.ReceiveAsync' yöntemleri. – Dai

2

Sen NetworkStream potansiyel ayrı oluşturma can ve soyut Stream gibi bu çalışmayı - böylece taşıma değiştirmek için veya sadece test için Stream koçanları oluşturmak mümkün olacak.

Bir yöntemin kendisi olarak - NetworkStream.Write içinde tek işlem var (durum kontrolleri hariç) streamSocket.Send(buffer, offset, size, SocketFlags.None); - bu yüzden çoğunlukla bu soket üzerine aramakla aynı.

İlgili konular