Enviar y recibir datos mediante una conexión de red

La tarea siguiente le muestra cómo enviar y recibir datos mediante una conexión HTTP con un sitio Web. Los datos devueltos del sitio Web se muestran en la pantalla. Puede utilizar un proceso semejante para enviar y recibir los datos mediante otros protocolos de red. Para hacer esta tarea tan general como sea posible, el código siguiente envía un comando HTTP GET manualmente a un servidor. Normalmente, utilizaría una interfaz de HttpConnection, que construye la cadena del comando HTTP según las opciones que configure.
PRECAUCIÓN:
Las operaciones de entrada y salida de red no son seguras para subprocesos. Aségurese de que crea un subproceso separado cuando utilice un objeto de Connection.
Antes de comenzar: Abra una conexión de red y pase un objeto de Connection al constructor de la clase desarrollada en esta tarea. Para obtener más información acerca de cómo abrir conexiones de red, consulte Abrir una conexión de red mediante la API de red o Abrir una conexión de red mediante el GCF.
  1. Importe las clases y las interfaces necesarias.
    import net.rim.device.api.ui.container.MainScreen;
    import net.rim.device.api.ui.component.RichTextField;
    import net.rim.device.api.ui.UiApplication;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import javax.microedition.io.*;
  2. Cree una clase que amplíe la clase MainScreen.
    public class HTTPOutputScreen extends MainScreen 
    {
  3. Cree una variable de la instancia para un objeto de RichTextField para mostrar los resultados.
    RichTextField _rtfOutput = new RichTextField();
  4. Cree a un constructor que acepte un objeto de Connection como argumento.
    public HTTPOutputScreen(Connection conn)
    {
  5. Añada el RichTextField a su pantalla, e inicie un subproceso para acceder a la conexión de red.
    _rtfOutput.setText("Retrieving data. Please wait...");
    add(_rtfOutput);
    ContentReaderThread t = new ContentReaderThread(conn);
    t.start();
  6. Cree un método para rellenar su RichTextField con los datos que devuelve el sitio Web, después de que ContentReaderThread se complete. Se invoca este método en el paso 20.
    public void showContents(final String result) 
    {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                _rtfOutput.setText(result);
            }
        });
    }
    
  7. En una clase interna, cree un subproceso para que se comunique con el servidor Web. Acepte un objeto de ConnectionDescriptor como argumento.
    private final class ContentReaderThread extends Thread
    {
        private Connection _connection;
        ContentReaderThread(Connection conn)
        {
            _connection = conn;
        }
        public void run()
        {
    
  8. Inicialice un objeto de OutputStream y un objeto de InputStream para intercambiar los datos con el sitio Web.
        OutputStream os = null;
        InputStream is = null;
  9. Inicialice un objeto de String para almacenar la respuesta del sitio Web.
        String result = "";
  10. Cree un objeto de OutputConnection para enviar los datos por su conexión.
        try
        {
            OutputConnection outputConn = (OutputConnection) connection;
  11. Recupere un OutputStream de su OutputConnection.
            os = outputConn.openOutputStream();
            String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n";
            os.write(getCommand.getBytes());
            os.flush();
  12. Envíe un comando HTTP GET al servidor Web sobre su OutputStream. Convierta el comando GET en una matriz de byte.
            String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n";
            os.write(getCommand.getBytes());
            os.flush();
  13. Cree un objeto de InputConnection para recibir los datos de su conexión.
            InputConnection inputConn = (InputConnection) connection;
  14. Recupere un InputStream de su InputConnection.
            is = inputConn.openInputStream();
  15. Recupere los datos transferidos y almacénelos en una matriz de byte.
            byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
            result = new String(data);
  16. Revise cualquier error que pueda generar su procedimiento.
        catch(Exception e)
        {
            result = "ERROR fetching content: " + e.toString();
        }
  17. Cierre su OutputStream.
            if(os != null)
            {
                try
                {
                    os.close();
                }
                catch(IOException e)
                {
                    // process the error condition
                }
            }
  18. Cierre su InputStream.
            if(is != null)
            {
                try
                {
                    is.close();
                }
                catch(IOException e)
                {
                }
            }
  19. Cierre su Connection.
            {
                connection.close();
            }
            catch(IOException ioe)
            {
            }
        }
  20. Llame al showContents() que creó en el paso 6.
        showContents(result);
    }
    }

¿Le ha resultado útil esta información? Envíenos sus comentarios.