×
Namespaces

Variants
Actions

Descargando datos desde un servidor usando Java ME

From Nokia Developer Wiki
Jump to: navigation, search

El propósito principal de este artículo es demostrar como descargar un archivo desde un servidor remoto usando la clase HttpConnection, y ver su contenido en una forma.

Article Metadata
Code Example
Source file: Media:HttpTest.zip
Tested with
Devices(s): Nokia Asha 303, Nokia Asha 310
CompatibilityArticle
Translated:
By cadlg
Updated: cadlg (15 Apr 2013)
Last edited: hamishwillee (25 Jul 2013)

Puntos Importantes

  • Un beneficio de usar la clase HttpConnection (en comparación a la clase StreamConnection) es la disponibilidad de un método para verificar el tamaño o longitud de los datos remotos. Los datos pueden entonces ser leídos en una sola operación, en contraste a tener que leerlos un caracter/byte a la vez.
  • Antes de salir del método viewFile(), se debe revisar el estado del input stream y la HttpConnection, y cerrarlos si es necesario.


Código de muestra para el cliente

Note.pngNote: En el artículo se utilizará texto en español para los comentarios en el código, pero en la aplicación descargable que lo acompaña, todos los textos se encuentran en Inglés.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
 
public class FileViewer extends MIDlet implements CommandListener {
private Display display; // Referencia al objeto Display
private TextBox tbViewer; // Para ver el contenido del archivo en un textbox
private Command cmView; // Command para ver el archivo
private Command cmExit; // Command para salir
private String url = "https://www.kernel.org/pub/software/scm/git/docs/v1.7.9.1/git-check-attr.txt";
 
public FileViewer() {
display = Display.getDisplay(this);
 
// Definir los objetos command
cmView = new Command("View", Command.SCREEN, 2);
cmExit = new Command("Exit", Command.EXIT, 1);
 
tbViewer = new TextBox("Viewer", "", 250, TextField.ANY);
tbViewer.addCommand(cmView);
tbViewer.addCommand(cmExit);
tbViewer.setCommandListener(this);
}
 
public void startApp() {
display.setCurrent(tbViewer);
}
 
private void viewFile() throws IOException
{
int iResponseCode;
HttpConnection http = null;
InputStream iStrm = null;
try {
http = (HttpConnection) Connector.open(url);
// ----------------
// Petición del cliente
// ----------------
// 1) Setear el método de request, en este caso GET
http.setRequestMethod(HttpConnection.GET);
// 2) Setear la información del encabezado (esto es opcional)
http.setRequestProperty("User-Agent",
"Profile/MIDP-1.0 Configuration/CLDC-1.0");
// 3) Setear el cuerpo de los datos - En este caso no hay
// ----------------
// Respuesta del servidor
// ----------------
// 1) Obtener el estado de la respuesta
iResponseCode = http.getResponseCode();
System.out.println("Msg: " + http.getResponseMessage());
System.out.println("Code: " + iResponseCode);
// 2) Verificar si el estado es el esperado
if (iResponseCode == HttpConnection.HTTP_OK)
{
// 3) Obtener los datos y desplegar el contenido
iStrm = http.openInputStream();
int length = (int) http.getLength();
if (length > 0)
{
byte serverData[] = new byte[length];
iStrm.read(serverData);
tbViewer.setString(new String(serverData));
}
}
else
System.out.println("No data can be read if response was not HTTP_OK");
}catch (Exception e){
e.printStackTrace();
}
finally
{
// Cerrar el stream
if (iStrm != null)
iStrm.close();
// Cerrar la conexión
if (http != null)
http.close();
}
}
 
public void pauseApp()
{
 
}
 
public void destroyApp(boolean unconditional)
{
 
}
 
public void commandAction(Command c, Displayable s)
{
if (c == cmView)
{
try {
viewFile();
} catch (Exception e)
{
e.printStackTrace();
}
} else if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}

Tip.pngTip: 

  • Observe que la conexión será realmente abierta y la petición (request) enviada en el momento en que se llame por primera vez cualquier método que requiera que algún dato sea recibido del servidor, en este caso getResponseCode().
  • Si usted necesita usar cualquiera de los valores obtenidos del objeto HttpConnection más de una vez, es recommendable almacenarlo en una variable local en vez de llamar al método varias veces, tal como se muestra arriba con el status code.


La mayor parte de este código puede ser usado para descargar y desplegar otros tipos de archivos. Muy probablemente usted sólo tendría que cambiar el objeto en el cual va a desplegar los contenidos del archivo, y los métodos usados para poner los datos en él. Para mostrar este punto, el código anterior ha sido modificado para agregar la opción de descargar un archivo de una imagen. Observe que el archivo de texto ahora es desplegado en un TextField, y la imagen es desplegada en un ImageItem, y ambos objetos ahora han sido agregados a una forma (Form).

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
 
public class FileViewer1 extends MIDlet implements CommandListener
{
private Display display; // Referencia al objeto Display
private Form form;
private TextField tfViewer; // Para ver el contenido del archivo de texto
private ImageItem iiViewer; // Para ver los contenidos del archivo de imagen
private Command cmViewText; // Command para ver el archivo de texto
private Command cmViewImage; // Command para ver la imagen
private Command cmExit; // Command para salir
private String urlText = "https://www.kernel.org/pub/software/scm/git/docs/v1.7.9.1/git-check-attr.txt";
private String urlImage = "http://a5.twimg.com/profile_images/3348709803/236c5e8be219e6bf690b67cec6202e9b_reasonably_small.png";
 
private static final int MODE_TEXT = 0;
private static final int MODE_IMAGE = 1;
 
public FileViewer1()
{
display = Display.getDisplay(this);
cmViewText = new Command("Download Text", Command.SCREEN, 2);
cmViewImage = new Command("Download Image", Command.SCREEN, 2);
cmExit = new Command("Exit", Command.EXIT, 1);
form = new Form("File viewer");
tfViewer = new TextField("Text Viewer", "", 5000, TextField.ANY);
iiViewer = new ImageItem("Image Viewer", null, ImageItem.LAYOUT_CENTER,"");
form.append(tfViewer);
form.append(iiViewer);
form.addCommand(cmViewText);
form.addCommand(cmViewImage);
form.addCommand(cmExit);
form.setCommandListener(this);
}
 
public void startApp()
{
display.setCurrent(form);
}
 
private void viewFile(int mode) throws IOException
{
int iResponseCode;
HttpConnection http = null;
InputStream iStrm = null;
// Setear la URL adecuada
String url = (mode==MODE_TEXT?urlText:urlImage);
try {
http = (HttpConnection) Connector.open(url);
// Request del cliente
// ----------------
// 1) Setear el método de request, en este caso GET
http.setRequestMethod(HttpConnection.GET);
// 2) Setear información del encabezado (esto es opcional)
http.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0");
// Respuesta del servidor
// ----------------
// 1) Obteniendo el código y mensaje de respuesta
iResponseCode = http.getResponseCode();
System.out.println("Msg: " + http.getResponseMessage());
System.out.println("Code: " + iResponseCode);
// 2) Verificando el estado de la respuesta
if (iResponseCode == HttpConnection.HTTP_OK)
{
// 3) Obtener los datos y mostrar el contenido
iStrm = http.openInputStream();
int length = (int) http.getLength();
if (length > 0)
{
byte serverData[] = new byte[length];
int bytesRead = iStrm.read(serverData);
if (bytesRead == length)
{
// Poniendo el contenido en el TextField o ImageItem según corresponda
if (mode==MODE_TEXT)
tfViewer.setString(new String(serverData));
else if (mode==MODE_IMAGE)
{
Image image = null;
try{
image = Image.createImage(serverData,0,length);
 
} catch (Exception e){
e.printStackTrace();
};
if (image != null){
iiViewer.setImage(image);
}
}
}
}
}
else
System.out.println("No data can be read if response was not HTTP_OK");
}catch (Exception e){
e.printStackTrace();
}
finally
{
// Cerrar el stream
if (iStrm != null)
iStrm.close();
// Cerrar la conexión
if (http != null)
http.close();
}
}
 
public void pauseApp(){}
 
public void destroyApp(boolean unconditional){}
 
public void commandAction(Command c, Displayable s)
{
if (c == cmViewText)
{
try {
viewFile(MODE_TEXT);
} catch (Exception e)
{
e.printStackTrace();
}
}
else if (c == cmViewImage)
{
try {
viewFile(MODE_IMAGE);
} catch (Exception e)
{
e.printStackTrace();
}
}
else if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}

Observe que la imagen descargada podría también ser desplegada en un Canvas usando el método drawImage().

Aquí hay un ejemplo:

protected void paint(Graphics g){
g.drawImage(image,0, 0, Graphics.LEFT|Graphics.TOP);
}


Source Code

El proyecto con el código demostrado en este artículo puede ser descargado aquí: Media:HttpTest.zip

This page was last modified on 25 July 2013, at 06:50.
66 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×