Bueno he realizado algunos cambios pero realmente no sé lo que está pasando.
Tenías razón sobre lo del buffer y conseguí resolver el problema en parte. Ahora me escribe todos los bytes, por lo menos en lo que a la cantidad se refiere, pero escribe lo que quiere ya que es ilegible.
Abrir el archivo directamente con alguna aplicación es imposible, no lo reconoce, y al abrir el archivo con un editor hexadecimal, y comparar el original y el transferido, pues veo que no se parecen en nada.
En el servidor tengo esto:
@Override
public void run() {
try {
entradaStr = new BufferedReader(new InputStreamReader(this.so.getInputStream()));
entrada = new DataInputStream(new BufferedInputStream(this.so.getInputStream()));
String linea = entradaStr.readLine();
System.out.println("Linea: " + linea);
String[] str = linea.split("&");
System.out.println("str: " + Arrays.toString(str));
for (String s : str) {
System.out.println(s);
}
String comando = str[0];
String nombre = str[1];
Long tam = Long.valueOf(str[2].trim());
salida = new DataOutputStream(new FileOutputStream(new File(nombre)));
byte[] b = new byte[8192];
int n;
while ((n = entrada.read(b)) != -1) {
salida.write(b);
}
entradaStr.close();
entrada.close();
salida.flush();
salida.close();
} catch (IOException ioe) {
ioe.printStackTrace();
System.exit(0);
}
System.exit(0);
}
Y en el cliente:
public static void main(String[] args) {
JFileChooser selector = new JFileChooser();
selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
selector.setMultiSelectionEnabled(false);
int res = selector.showOpenDialog(selector);
if (res == JFileChooser.APPROVE_OPTION) {
File fila = selector.getSelectedFile();
String nombre = fila.getName();
String tam = String.valueOf(fila.length());
String comando = "UP";
String remoto = "127.0.0.1";
String del = "&";
int puerto = 57000;
try {
Socket so = new Socket(remoto, puerto);
so.setSoLinger(true, 5);
String linea = comando + del + nombre + del + tam + "\n";
DataInputStream entrada = new DataInputStream(new FileInputStream(fila));
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(so.getOutputStream()));
salida.writeBytes(linea);
int n;
byte[] b = new byte[8192];
while ((n = entrada.read(b)) != -1) {
salida.write(b);
}
entrada.close();
salida.flush();
salida.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
He puesto un buffer como me indicabas pero ya digo que no comprendo como hacer esto de forma correcta.
No estoy obligado a utilizar esta fórmula ni mucho menos, tengo flexibilidad total, pero me llega al alma no comprender algo que en principio es sencillo, y que aparentemente sobre el papel es correcto.
No lo comprendo.