Transferencia de archivos Java a través de sockets: envío y recepción de matrices de bytes
En Java, la transferencia de archivos a través de sockets implica convertir el archivo en matrices de bytes, enviándolos a través del socket y luego convirtiendo los bytes nuevamente en un archivo en el extremo receptor. Este artículo aborda un problema encontrado por un desarrollador de Java al implementar esta funcionalidad de transferencia de archivos.
Problema del lado del servidor
El código del servidor parece crear un archivo vacío al recibirlo datos del cliente. Para resolver esto, el servidor debe usar un bucle para leer los datos enviados por el cliente en fragmentos, usando un búfer para almacenar temporalmente los datos. Una vez que se han recibido todos los datos, el servidor puede escribir el archivo completo. El código del servidor corregido es el siguiente:
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
Problema del lado del cliente
El código del cliente envía inicialmente una matriz de bytes vacía al servidor. Para enviar el contenido real del archivo, se debe utilizar el siguiente código:
FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
Código mejorado
Con las correcciones antes mencionadas, el código completo para servidor y cliente es el siguiente:
Servidor:
...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
FileOutputStream fos = new FileOutputStream("C:\\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fos.close();
...
Cliente:
...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
File file = new File("C:\\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3