Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > ¿Como hago que el servidor rechaze solo los archivos .exe? El servidor acepta cualquier archivo y trabajo con socket entre un cliente y servidor ya hize lo que pueda pero nose como implementar esa condición ayúdenme crack. He visto que con JFileChooser h

//ENVIO ARCHIVO ENTRE CLIENTE-SERVIDOR
//Proceso del servidor
package sockets3_servidor;

import java.io.*;
import java.net.*;
import javax.swing.*;


public class Sockets3_servidor {

static Socket cliente=null;
static ServerSocket servidor = null;
static String nombreArchivo;


public static void main(String[] args) throws IOException {
JOptionPane.showMessageDialog(null, "SERVICIO INICIADO","Mensaje",JOptionPane.INFORMATION_MESSAGE);
Sockets3_servidor p = new Sockets3_servidor();
servidor = new ServerSocket(5000);
p.iniciarservidor(servidor);
}


public Sockets3_servidor() throws IOException {
// Creamos socket servidor escuchando en el mismo puerto donde se comunica el cliente
// en este caso el puerto es el 4400
System.out.println("ESPERANDO ARCHIVOS COMPATIBLES"); }


public void iniciarservidor(ServerSocket servidor) {
while(true) {
try {
// Creamos el socket que atendera el servidor
cliente = servidor.accept();
// Creamos flujo de entrada para leer los datos que envia el cliente
DataInputStream dis = new DataInputStream(cliente.getInputStream());
// Obtenemos el nombre del archivo
nombreArchivo = dis.readUTF();
// Obtenemos el tamaño del archivo
int tam = dis.readInt();
System.out.println("VERIFICANDO TIPO DE ARCHIVO ");
// Creamos flujo de salida, este flujo nos sirve para
// indicar donde guardaremos el archivo
//para ello en C: cree la carpeta ARCHIVO
FileOutputStream fos = new FileOutputStream(nombreArchivo);
try (BufferedOutputStream out = new BufferedOutputStream(fos);
BufferedInputStream in = new BufferedInputStream(cliente.getInputStream())) {


// Creamos el array de bytes para leer los datos del archivo
byte[] buffer = new byte[tam];
// Obtenemos el archivo mediante la lectura de bytes enviados
for(int i=0;i<buffer.length;i++) {buffer[i] = (byte)in.read();}
//Escribimos el archivo
out.write(buffer);
//Cerramos los flujos
out.flush(); }
cliente.close();
System.out.println("RECIBIENDO ARCHIVO: "+nombreArchivo);

} catch (IOException e) {System.out.println(""+e.toString());}
}

}

}

marzo 4, 2021 | Registered Commenterfabriciom

Guenas.

Me imagino que la extensión ya la controlas, asé que iré por otro derrotero.
Los archivos .EXE si no me equivoco empiezan por los ascii MZ, es decir 4D 5A. Puedes leer los primeros 2 bytes y si son estos no aceptarlos.
No me parece un sistema demasiado bueno porque te podrían enviar un fichero de datos que empezara así y no fuera un ejecutable. Quizá la obtención del tipo Mime pueda ayudar pero en java lo he visto fallar miserablemente. Si alguien recuerda ensamblador probablemente pueda decirte que puedas buscar y en que posiciones para saber si es un fichero EXE o no.
Aún así un fichero de datos podría coincidir con un EXE (si, puta chiripa pero es posible)

La verdad es que aunque sea por curiosidad me gustaría saber un sistema fiable para comprobarlo y agradecería algún otro post mejor que el mio.

Un saludo,
Paposo

abril 3, 2021 | Unregistered CommenterPaposo

Yo en tu lugar usaría webservices (restful) para transmitir ficheros.

abril 22, 2021 | Unregistered CommenterJavier