Usar flujos en la redUsing Streams on the Network

Los recursos de red se representan como secuencias en .NET Framework.Network resources are represented in the .NET Framework as streams. Al tratar las secuencias de forma genérica, .NET Framework ofrece lo siguiente:By treating streams generically, the .NET Framework offers the following capabilities:

  • Un método común para enviar y recibir datos web.A common way to send and receive Web data. Independientemente del contenido real del archivo (HTML, XML, etc.), la aplicación usará Stream.Write y Stream.Read para enviar y recibir datos.Whatever the actual contents of the file — HTML, XML, or anything else — your application will use Stream.Write and Stream.Read to send and receive data.

  • Compatibilidad con las secuencias en .NET Framework.Compatibility with streams across the .NET Framework. Las secuencias se usan por todo .NET Framework, que posee una amplia infraestructura para gestionarlas.Streams are used throughout the .NET Framework, which has a rich infrastructure for handling them. Por ejemplo, puede modificar una aplicación que lee datos XML de una FileStream para que lea los datos de una NetworkStream cambiando únicamente las pocas líneas de código que inicializan la secuencia.For example, you can modify an application that reads XML data from a FileStream to read data from a NetworkStream instead by changing only the few lines of code that initialize the stream. Las principales diferencias entre la clase NetworkStream y otras secuencias radican en que no se pueden hacer búsquedas en NetworkStream, la propiedad CanSeek siempre devuelve false y los métodos Seek y Position generan NotSupportedException.The major differences between the NetworkStream class and other streams are that NetworkStream is not seekable, the CanSeek property always returns false, and the Seek and Position methods throw a NotSupportedException.

  • Procesamiento de los datos a medida que llegan.Processing of data as it arrives. Las secuencias proporcionan acceso a los datos a medida que llegan de la red, en lugar de obligar a la aplicación a esperar mientras se descarga un conjunto completo de datos.Streams provide access to data as it arrives from the network, rather than forcing your application to wait for an entire data set to be downloaded.

El espacio de nombres System.Net.Sockets contiene una clase NetworkStream que implementa la clase Stream específicamente para su uso con recursos de red.The System.Net.Sockets namespace contains a NetworkStream class that implements the Stream class specifically for use with network resources. Las clases del espacio de nombres System.Net.Sockets usan la clase NetworkStream para representar las secuencias.Classes in the System.Net.Sockets namespace use the NetworkStream class to represent streams.

Para enviar datos a la red mediante la secuencia devuelta, llame a GetRequestStream en su WebRequest.To send data to the network using the returned stream, call GetRequestStream on your WebRequest. WebRequest enviará encabezados de solicitud al servidor; después podrá enviar datos al recurso de red mediante una llamada al método BeginWrite, EndWrite o Write de la secuencia devuelta.The WebRequest will send request headers to the server; then you can send data to the network resource by calling the BeginWrite, EndWrite, or Write method on the returned stream. Algunos protocolos, como HTTP, pueden requerir que se establezcan propiedades específicas del protocolo antes de enviar los datos.Some protocols, such as HTTP, may require you to set protocol-specific properties before sending data. En el siguiente ejemplo de código se muestra cómo se establecen las propiedades específicas de HTTP para enviar datos.The following code example shows how to set HTTP-specific properties for sending data. Se presupone que la variable sendData contiene los datos que se van a enviar y que la variable sendLength es el número de bytes de datos que se van a enviar.It assumes that the variable sendData contains the data to send and that the variable sendLength is the number of bytes of data to send.

HttpWebRequest request =   
   (HttpWebRequest) WebRequest.Create("http://www.contoso.com/");  
request.Method = "POST";  
request.ContentLength = sendLength;  
try  
{  
   Stream sendStream = request.GetRequestStream();  
   sendStream.Write(sendData,0,sendLength);  
   sendStream.Close();  
}  
catch  
{  
   // Handle errors . . .  
}  
Dim request As HttpWebRequest = _  
   CType(WebRequest.Create("http://www.contoso.com/"), HttpWebRequest)  
request.Method = "POST"  
request.ContentLength = sendLength  
Try  
   Dim sendStream As Stream = request.GetRequestStream()  
   sendStream.Write(sendData, 0, sendLength)  
   sendStream.Close()  
Catch  
   ' Handle errors . . .  
End Try  

Para recibir datos de la red, llame a GetResponseStream en su WebResponse.To receive data from the network, call GetResponseStream on your WebResponse. Después podrá leer los datos del recurso de red mediante una llamada al método BeginRead, EndRead o Read de la secuencia devuelta.You can then read data from the network resource by calling the BeginRead, EndRead, or Read method on the returned stream.

Si usa secuencias de recursos de red, tenga en cuenta lo siguiente:When using streams from network resources, keep in mind the following points:

  • La propiedad CanSeek siempre devuelve false, ya que la clase NetworkStream no puede cambiar la posición en la secuencia.The CanSeek property always returns false since the NetworkStream class cannot change position in the stream. Los métodos Seek y Position generan NotSupportedException.The Seek and Position methods throw a NotSupportedException.

  • Si usa WebRequest y WebResponse, las instancias de secuencia creadas mediante la llamada a GetResponseStream son de solo lectura, mientras que las instancias de secuencia creadas mediante la llamada a GetRequestStream son de solo escritura.When you use WebRequest and WebResponse, stream instances created by calling GetResponseStream are read-only and stream instances created by calling GetRequestStream are write-only.

  • Use la clase StreamReader para facilitar la codificación.Use the StreamReader class to make encoding easier. En el siguiente ejemplo de código se usa un StreamReader para leer una secuencia con codificación ASCII de una WebResponse (en el ejemplo no se muestra la creación de la solicitud).The following code example uses a StreamReader to read an ASCII-encoded stream from a WebResponse (the example does not show creating the request).

  • La llamada a GetResponse puede bloquearse si los recursos de red no están disponibles.The call to GetResponse can block if network resources are not available. Debe considerar el uso de una solicitud asincrónica con los métodos BeginGetResponse y EndGetResponse.You should consider using an asynchronous request with the BeginGetResponse and EndGetResponse methods.

  • La llamada a GetRequestStream puede bloquearse mientras se establece la conexión con el servidor.The call to GetRequestStream can block while the connection to the server is created. Debe considerar el uso de una solicitud asincrónica para la secuencia con los métodos BeginGetRequestStream y EndGetRequestStream.You should consider using an asynchronous request for the stream with the BeginGetRequestStream and EndGetRequestStream methods.

// Create a response object.  
WebResponse response = request.GetResponse();  
// Get a readable stream from the server.  
StreamReader sr =   
   new StreamReader(response.GetResponseStream(), Encoding.ASCII);  
// Use the stream. Remember when you are through with the stream to close it.  
sr.Close();  
' Create a response object.  
Dim response As WebResponse = request.GetResponse()  
' Get a readable stream from the server.  
Dim sr As _   
   New StreamReader(response.GetResponseStream(), Encoding.ASCII)  
' Use the stream. Remember when you are through with the stream to close it.  
sr.Close()  

Vea tambiénSee Also

Cómo solicitar datos mediante la clase WebRequestHow to: Request Data Using the WebRequest Class
Solicitud de datosRequesting Data