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
.