c# sockets networkstream

c# - NetworkStream.Write vs. Socket.Send



sockets (2)

Puede separar la creación de NetworkStream y trabajar con eso como con Abstract Stream , para que pueda cambiar su transporte o simplemente para crear Stream stubs para probar.

Como una cuestión de método en sí: NetworkStream.Write inside tiene la única operación (excepto cheques de estado) streamSocket.Send(buffer, offset, size, SocketFlags.None); - Por lo tanto, es casi lo mismo que llamarlo en el socket.

Tengo una aplicación de CA para la que utilizo una biblioteca FTP personalizada. En este momento estoy usando Socket.Send para enviar los datos, pero me preguntaba si sería mejor iniciar un NetworkStream con el socket y usar NetworkStream.Write en su lugar.

¿Hay alguna ventaja al usar una sobre la otra?


La ventaja de un NetworkStream deriva principalmente del hecho de que es un Stream . La desventaja de un Socket es que el código común que lee y escribe desde fuentes abstractas de E / S como un Stream no puede manejar un Socket .

El caso de uso principal para un NetworkStream es que tiene algún código en otro lugar que lee o escribe desde un Stream , y desea poder usarlo con un Socket . ¡Sabrías si estuvieras en esta situación y entonces NetworkStream sería de gran ayuda!

Supongamos, por ejemplo, que tiene una biblioteca de comunicaciones y admite la serialización de mensajes de archivos, named pipes y TCP / IP. La opción ideal para la clase de E / S sería Stream . Entonces sus métodos de serialización podrían aceptar un FileStream , un PipeStream o un NetworkStream . Incluso aceptaría un MemoryStream . Este es el beneficio de la abstracción porque después de que hemos creado la transmisión, un método puede interactuar con ella sin saber qué tipo de transmisión es.

En este sentido, un NetworkStream utiliza el patrón de diseño del adaptador . Adapta la API Socket a Stream API para que los clientes que esperan un Stream puedan usarla.

Entonces, finalmente, la pregunta, si NetworkStream es un adaptador Stream para un Socket , ¿cuál deberíamos usar? Bueno, si necesita un Stream , entonces NetworkStream es su única opción. Si no necesita un Stream , puede usar cualquier API con la que se sienta más cómodo. Si ya está utilizando Socket éxito, no hay razón de NetworkStream para cambiar a NetworkStream .