2012-03-04 16 views
19

Entiendo que un TcpClient es un envoltorio alrededor de la clase de socket, y puedo acceder al socket subyacente si uso el TcpClient, pero ¿qué hace exactamente el wrapper?¿Cuáles son los beneficios de usar TcpClient en un Socket directamente?

Al usar TCPClient, ¿debo seguir llamando a Receive() como hago con un socket o el wrapper asegura que todos mis datos aparezcan?

Por último, puedo usar la TcpClient tanto en el servidor y el cliente para envolver el zócalo (después de usar TcpListener para aceptar la conexión original en el servidor)

Respuesta

17

¿Qué hace exactamente el envoltorio?

Déjenme explicar esto con un ejemplo. Tiene un método en C# File.ReadAllLines. Lee todas las líneas del archivo por ti. Ahora también puede obtener los mismos resultados a través de la clase FileStream o de cualquier otra clase que lea el archivo ... PERO ... envoltorio, es decir, File.ReadAllLines, le permite lograr lo mismo con menos líneas de código. Envolturas siempre aumentan la productividad mediante la abstracción de los detalles de bajo nivel

Cuando se utiliza el TCPClient ¿Tengo que seguir llamando Recibir() como yo con una toma de corriente o se asegura el envoltorio todo parece mis datos?

TCPClient no tienen un método Receive como Socket pero la idea es igual. Usted tendrá que utilizar métodos como GetStream para leer los datos no aparecerá automagicamente para usted

¿Puedo usar el TcpClient tanto en el servidor y el cliente para envolver el zócalo

Sí , puede usarlo con seguridad tanto en el lado del cliente como del servidor

+0

Ah, ya veo. Así que estoy en lo cierto al decir que el equivalente de ejecutar _BeginReceive(), seguido de EndReceive(), almacenar bytes y recuperar BeginReceive() nuevamente hasta que se reciba el mensaje_ en un socket, se puede realizar usando _myTcpClient.GetStream(). BeginRead() _ en un TcpClient? Will BeginRead() no llamará a la devolución de llamada EndRead() hasta que se haya recibido la cantidad de bytes especificada recibida? (eliminando la necesidad de llamar constantemente a BeginRead()/BeginReceive() hasta que se hayan recibido todos los bytes esperados) – Dermot

+1

Preferiría usar los métodos 'Read' y' Write' de la clase 'NetworkStream' en lugar de' BeginRead' y 'EndRead' porque no tendrá que llamar explícitamente a 'BeginRead' y' EndRead', el contenedor lo haría por usted. Vea algunas muestras en Internet como esta http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx –

+0

Gracias por aclarar eso para mí. – Dermot

Cuestiones relacionadas