2012-03-04 39 views
19

Tôi hiểu rằng một TcpClient là một trình bao bọc quanh lớp socket, và tôi có thể truy cập vào socket bên dưới nếu sử dụng TcpClient, nhưng chính xác thì trình bao bọc sẽ làm gì?Lợi ích của việc sử dụng TcpClient qua Socket trực tiếp là gì?

Khi sử dụng TCPClient tôi có cần tiếp tục gọi Receive() như tôi làm với ổ cắm hay trình bao bọc đảm bảo tất cả dữ liệu của tôi xuất hiện không?

Cuối cùng, tôi có thể sử dụng TcpClient trên cả máy chủ và máy khách để bọc các ổ cắm (sau khi sử dụng TcpListener để chấp nhận các kết nối ban đầu trên máy chủ)

Trả lời

17

những gì chính xác nào wrapper làm gì?

Hãy để tôi giải thích điều này với một ví dụ. Bạn có phương thức trong C# File.ReadAllLines. Nó đọc tất cả các dòng trong tập tin cho bạn. Bây giờ bạn cũng có thể đạt được kết quả tương tự thông qua lớp học FileStream hoặc bất kỳ lớp nào khác đọc tệp .. NHƯNG .. trình bao bọc tức là File.ReadAllLines, cho phép bạn đạt được cùng với ít dòng mã hơn. Máy đóng gói luôn tăng năng suất bằng cách trừu tượng ra các chi tiết ở mức độ thấp

Khi sử dụng TCPClient để tôi cần phải tiếp tục gọi Nhận() như tôi làm với một ổ cắm hoặc không wrapper đảm bảo tất cả các dữ liệu của tôi xuất hiện?

TCPClient không có phương pháp Receive như Socket nhưng ý tưởng là giống nhau. Bạn sẽ phải sử dụng các phương pháp như GetStream để đọc dữ liệu nó sẽ không xuất hiện tự động cho bạn

Tôi có thể sử dụng TcpClient trên cả máy chủ và máy khách để bọc các ổ cắm

Có , bạn có thể sử dụng an toàn trên cả máy khách và phía máy chủ

+0

Tôi hiểu rồi. Vì vậy, tôi phải nói rằng tương đương với thực hiện _BeginReceive(), tiếp theo EndReceive(), lưu trữ byte và gọi lại BeginReceive() một lần nữa cho đến khi tin nhắn receive_ trên một socket, có thể được thực hiện bằng cách sử dụng _myTcpClient.GetStream(). BeginRead() _ trên một TcpClient? Sẽ BeginRead() không gọi hàm EndRead() cho đến khi nhận được số byte được chỉ định đã thực sự được nhận chưa? (loại bỏ sự cần thiết phải liên tục gọi BeginRead()/BeginReceive() cho đến khi tất cả các byte dự kiến ​​đã nhận được) – Dermot

+1

Tôi muốn sử dụng các phương thức 'Read' và' Write' của lớp 'NetworkStream' thay vì' BeginRead' và 'EndRead' bởi vì bạn sẽ không phải gọi một cách rõ ràng 'BeginRead' và' EndRead' trình bao bọc sẽ làm điều đó cho bạn. Xem một số mẫu trên internet như thế này http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx –

+0

Cảm ơn bạn đã làm rõ điều đó đối với tôi. – Dermot

Các vấn đề liên quan