2012-03-04 9 views
19

Rozumiem, że TcpClient jest wrapper wokół klasy gniazda, i mogę uzyskać dostęp do podstawowego gniazda, jeśli korzystam z TcpClient, ale co dokładnie robi opakowanie?Jakie są zalety bezpośredniego używania TcpClient przez gniazdo?

Podczas korzystania z protokołu TCPClient muszę wywoływać funkcję Receive(), tak jak robię to przy użyciu gniazda lub czy opakowanie zapewnia wyświetlanie wszystkich moich danych?

Wreszcie mogę użyć TcpClient zarówno serwera i klienta do owijania gniazdo (po użyciu TcpListener zaakceptować oryginalne połączenie na serwerze)

Odpowiedz

17

co dokładnie ma owinięcie zrobić?

Pozwolę sobie wyjaśnić to na przykładzie. Masz metodę w języku C# File.ReadAllLines. Czyta wszystkie linie w pliku dla ciebie. Teraz możesz również osiągnąć te same wyniki, korzystając z klasy FileStream lub dowolnej innej klasy, która czyta plik. Opakowanie, tj. File.ReadAllLines, pozwala osiągnąć to samo z mniejszą liczbą linii kodu. Owijarki zawsze zwiększenie produktywności przez abstrahowanie się niskie szczegóły poziomu

Podczas korzystania z TcpClient muszę wzywasz Receive() tak jak ja z gniazdka lub jest owinięcie zapewnić wszystkim pojawia się moje dane?

TCPClient nie mają Receive metody takie jak Socket ale idea jest taka sama. Będziesz musiał użyć metody jak GetStream do odczytu danych nie będzie automagicznie pojawiają Ci

mogę użyć TcpClient zarówno serwera i klienta, aby owinąć gniazdo

Tak możesz bezpiecznie używać go zarówno po stronie klienta, jak i po stronie serwera:

+0

Ah Widzę. Więc mam rację mówiąc, że odpowiednik wykonywania _BeginReceive(), a następnie EndReceive(), przechowywania bajtów i wywoływania BeginReceive() ponownie, aż do otrzymania receive_ na gnieździe, można wykonać za pomocą _myTcpClient.GetStream(). BeginRead() _ na TcpClient? Czy funkcja BeginRead() nie wywoła wywołania zwrotnego EndRead(), dopóki nie zostanie odebrana określona liczba odebranych bajtów? (usunięcie potrzeby ciągłego wywoływania BeginRead()/BeginReceive() aż do otrzymania wszystkich oczekiwanych bajtów) – Dermot

+1

Wolałbym używać metod 'Read' i' Write' klasy 'NetworkStream' zamiast' BeginRead' i 'EndRead' ponieważ nie będziesz musiał jawnie wywoływać poleceń "BeginRead" i "EndRead", zrobi to za Ciebie. Zobacz kilka przykładów w Internecie, takich jak ten http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx –

+0

Dzięki za wyjaśnienie tego dla mnie. – Dermot

Powiązane problemy