Java - Descargar ficheros en java J2ME

 
Vista:
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Descargar ficheros en java J2ME

Publicado por Juan (70 intervenciones) el 21/03/2020 13:42:59
Hola buenas tengo un pequeño problema y quisiera ver si alguno sabe y puede ayudarme. Necesito descargar un archivo y guardarlo en una memoria (obviamente jeje), en una carpeta. para luego acceder a este archivo. En java lo se hacer fácilmente. el problema está en que necesito hacerlo en J2ME y hay poco material en foros y de mas porque pocas personas utilizan esta versión de java. esta versión es una versión reducida para programar en dispositivos M2M y me parece que en teléfonos tambien. por lo tanto muchas librerías usadas en java no funcionan en j2me. lo que busco hacer es una actualización de mi programa remotamente. para eso necesito descargar unos archivos, y luego hacer la actualización. En java lo hago de esta manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void descargar(String url, String ficheroDestino) throws Exception {
 
		   URL ficheroUrl = new URL(url);
		   InputStream inputStream = ficheroUrl.openStream();
		   OutputStream outputStream = new FileOutputStream(ficheroDestino); // path y nombre del nuevo fichero creado
 
		   byte[] b = new byte[2048];
		   int longitud;
 
		   while ((longitud = inputStream.read(b)) != -1) {
		      outputStream.write(b, 0, longitud);
		   }
 
		   inputStream.close();
		   outputStream.close();
		}

Problema? la clase URL no está en j2me. por lo tanto no puedo hacer ese tipo de conexión. he intentado hacerlo de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void toFile(String url) throws IOException {
		InputStream inputStream = Connector.openInputStream(url);
 
		byte[] b = new byte[2048];
		int longitud;
 
	    FileConnection fconn = null;
	    OutputStream os = null;
 
	    try {
	      fconn = (FileConnection) Connector.open("file:///a:/" + FILE_JAR);
 
	      if (!fconn.exists()) {
	        fconn.create();
	      }
 
	      fconn.delete();
	      fconn.create();
	      long file_size = fconn.availableSize();
 
	      os = fconn.openOutputStream(file_size);
 
	      while ((longitud = inputStream.read(b)) != -1) {
			   	os.write(b, 0, longitud);
 
		   }
	      os.write("\r\n".getBytes());
 
	    } finally {
	      if (os != null) {
	        os.close();
	        inputStream.close();  // Cerramos la conexión entrada
	      }
 
	      if (fconn != null) {
	        fconn.close();
	      }
	    }
	  }

con la clase Connection pero no me ha funcionado. se que esa versión no se usa mucho, pero si hay alguien que sepa y pueda echarme una mano estaria muy agradecido.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Descargar ficheros en java J2ME

Publicado por Juan (70 intervenciones) el 23/03/2020 12:24:04
Bueno lo solucione. les comento la solucion por si alguna vez lo lee alguien que le pueda ayudar.

He aprovechado una conexión por socket que hacía con el dispositivo. y he pasado los archivos por ahí. de esta manera no hay error, ya que lo único que se envía es el archivo. el codigo que puse anteriormente daba error, porque pasaba datos de la conexión, no del archivo. y nunca supe cómo pasar solo los datos del archivo, o como obtener estos datos solo. así que los pase a través de un socket, quedando de esta manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public void download(String fichero){
		 FileConnection fconn = null;
		 OutputStream os = null;
	       try
	        {
	        	socket = (StreamConnection)Connector.open("socket://" +HOST + ":" + PORT);
	        	output = socket.openDataOutputStream();
 
			/*------------ Enviamos los datos para la autenticacion ------------*/
				output.writeUTF("**************************************"+fichero+"\n");
				fconn = (FileConnection) Connector.open("file:///a:/"+fichero,Connector.READ_WRITE);
				if (!fconn.exists()) {
			        fconn.create();
			      }
			      fconn.delete();
			      fconn.create();
			      long file_size = fconn.availableSize();
 
			      os = fconn.openOutputStream(file_size);
			     Logger.message("Archivo creado");
	            InputStream ois = socket.openInputStream();
	            byte[] contenidoUno = new byte[2000];
	            int longuitud=0;
 
	            while((longuitud = ois.read(contenidoUno))!=-1){
	            	os.write(contenidoUno, 0, longuitud);
	            	contenidoUno = new byte[2000];
	            }
 
	        } catch (Exception e){
	            e.printStackTrace();
	        }finally{
	        	try {
	        		if (os != null) {
	        	        os.close();
	        	      }
	        	    if (fconn != null) {
	        	        fconn.close();
	        	      }
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
	        }
	    }

Y se lo explico un poco, establezco la conexión por socket, y mando un mensaje al servidor solicitando el archivo, la variable fichero tiene el nombre del archivo. y los asteriscos es una codificación que puse en asteriscos por razones obvias jeje. es una codificación que envió al servidor para que no cualquiera pueda descargar el archivo (todo esto dependera de como tengáis vosotros el servidor) simplemente es pasarle un mensaje que el servidor reconozca y responda con el archivo. luego creo el archivo con la linea: fconn = (FileConnection) Connector.open("file:///a:/"+fichero,Connector.READ_WRITE);

y luego creo un arreglo de byte de 2000 de tamaño, para leer el archivo en trozos de 2000 bytes. que es como el servidor lo manda también. cuando sea -1 es final del archivo. y listo archivo descargado. Y ya esta por fin di con la solución jeje. Asi que se los dejo por si le quito horas de pensar y probar a alguien, y no las pierda como lo hice yo jeje.

LES RECUERDO QUE ESTOY HABLANDO DE JAVA J2ME, NO DE JAVA SE, hay otras soluciones a esta en java se que no funcionan en java j2me, lo dijo por si alguien intenta usar esto en Java se no les funcionara. ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Descargar ficheros en java J2ME

Publicado por Franklin (179 intervenciones) el 23/03/2020 13:22:06
Aunque no lo requiero de momento Gracias por subir la respuesta, siempre de agradece este tipo de aportes. ( +1 )

Mi Consulta: Que método es mas eficiente para el envió de archivos (colocando el mismo caso, de enviar x files para generar un update)

Mediante URL o Socket? Claro yo he de suponer que si haces esto Mediante Socket y estás en un entorno cerrado (dentro de la misma infraestructura: Oficina, habitació, etc) debería de ser mejor Socket.

Pero en la situación que NO se encuentre conectado directamente al servidor.?

Quizás puede googlearlo pero se me hace mas interesante consultarlo acá.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Descargar ficheros en java J2ME

Publicado por Juan (70 intervenciones) el 23/03/2020 14:11:39
Hola Frankiln, yo no soy un experto en el tema. y la verdad no te puedo dar una respuesta acertada jeje

Pero te doy mi opinión. Todo dependerá evidentemente del sistema que tengas montado. si es compartir archivos en una red local. o en una red pública, el tipo de archivo que envías. la conexión que tienen los dispositivos tanto el receptor como el remitente. si el archivo contiene información delicada y debe estar protegido, etc.

No se cual es la mejor opción, yo creo que si no tienes ya un servidor por socket. para no tener que crearlo, simplemente se coloca el archivo accesible a través de una dirección https (que fue lo primero que intente) y cuando requieras el archivo te conectas a esa dirección y lo descargas. y si necesita protección lo colocas en https con un tipo de autenticación ya sea por usuario y contraseña o con un token. aunque ya esto requiere un poco más de trabajo jeje.

mi solución al final opte por el socket (a parte de que no pude hacerlo por http en J2Me jeje) porque ya tenia un servidor con socket creado, y aproveche ese servidor. como antes el dispositivo ya se tuvo que autenticar al servidor, ya es una conexión de socket segura simplemente añadí una codificación por añadir un poco mas de seguridad.

Bueno sin enrollarme más, mi servidor tiene los 2 tipos de conexión, tanto https con token y conexión por socket. Y mi dispositivo tiene una línea telefónica no wifi (es decir tiene datos de conexión limitados) por lo tanto me conviene mas por socket, porque ya el dispositivo está autentificado y conectado por socket, y simplemente es decir al servidor enviame esto y lo guardo en memoria. esta conexión me requiere menos trabajo y menos consumo de datos. si lo hago por https con token, tengo que identificarme, luego enviar el token y luego recibir el archivo (una diferencia de unos 8kb de datos calculando a ojo jeje) no es nada pero para mi dispositivo por ejemplo con datos limitados si.

Si no hubiese tenido el servidor con socket, lo hubiese hecho por https, ya que la descarga de este archivo no es constante, simplemente es cuando quiera actualizar la app.

Pero por ejemplo, si la descarga del archivo es constante, es preferible por socket. porque? porque la comunicación es más ligera te autentificas una sola vez, y solo envias el archivo en las próximas conexiones. si lo haces por https con token. debes enviar el token en cada petición. lo que te consume mas memoria y mas datos de consumo. Asi que tambien depende de la cantidad de veces que tengas que solicitar ese archivo. si es 1 vez al mes https con token. si son 50 veces al dia socket.

1 vez al mes = 10kb por https casi lo mismo que un socket bien autentificado.

50 veces en un dia = son 10kb cada petición = 500kb al dia = 15,5 mb al mes por http
50 veces en un dia = 10kb la primera conexión, el resto 2kb = 28kb en un dia = 868kb al mes. pudiendo llegar a 1 mb al mes por mantener conexión. Con socket

por lo tanto conviene con socket. con comunicacion constantes si cierras conexion con cada peticion consume mas evidentemente porque tendras que volver a autentificarte.

Todo esto depende del tamaño del archivo evidentemente, este ejemplo es con un archivo muy pequeño que contiene un par de datos solo.

Todo esto hablando de pasarse un archivo entre un servidor y un programa. Si quieres pasar el archivo a una persona, evidentemente https.


Así que depende de lo que quieras hacer, de cuantas veces lo vas a hacer. de la seguridad que necesite. de la conexión que tengas (wifi o datos) de la memoria. de la red de trabajo, etc.

pero como te dijo no soy experto, es solo mi opinión que a lo mejor es errónea jeje. Así que mucho caso no me hagas jejeje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar