Estimados:
Tengo un problema con un envío de ficheros, el problema es que el socket o hilo, en realidad no se, se bloquea. esta es la clase que usa el cliente y el servidor para el envio y recepción de ficheros. Dejo en claro que esto solo envía ficheros de textos. La verdad es que no tengo problemas al enviar o recibir un fichero de texto por localhost, el problema viene cuando uso internet. Solo logro enviar y recibir textos como por ejemplo el nombre del usuario, dirección, cosas así. Alguien tendría la amabilidad de ayudarme por favor.
Pd: Es un servidor que gestiona multiples clientes. Estas funciones son usadas el metodo run().
El servidor recibe 2 archivos, y responde con un archivo.
package Mensaje;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Mensaje para pedir un fichero.
*/
public class DameFichero
{
public DameFichero
(Socket socket
) {
this.socket = socket;
}
{
try
{
// Apertura del fichero y creacion de BufferedReader para poder
// hacer una lectura comoda (disponer del metodo readLine()).
archivo
= new File (nombreFileNotas
);
archivoResultado
= new FileWriter("resul_"+nombreFileNotas
);
// Lectura del fichero
int contador = 0;
//leemos las lineas que no nos sirven para calcular las notas
linea=br.readLine();
linea=br.readLine();
linea=br.readLine();//en esta linea los nombres de las columnas
pw.println(linea+"\tPromedio_final");// le agregamos una ultima colum
while((linea=br.readLine())!=null)
{
try
{
//filtramos por tokens
float C1, C2, C3, NE;
//quitamos los tokens que no nos sirven
for (int i = 0; i < 3; i++)
st.nextToken();
C1
= Float.
parseFloat(st.
nextToken()); C2
= Float.
parseFloat(st.
nextToken()); C3
= Float.
parseFloat(st.
nextToken()); NE
= Float.
parseFloat(st.
nextToken()); //escribimos la nota al final de cada columna
pw.println(linea+"\t"+Redondear(getNotaFinal(C1,C2,C3,NE)));
}
{
System.
out.
println("problemas con el numero flotante"); e.printStackTrace();
}
}
}
e.printStackTrace();
}
finally
{
// En el finally cerramos el fichero, para asegurarnos
// que se cierra tanto si todo va bien como si salta
// una excepcion.
try
{
fr.close();
br.close();
pw.close();
}
e2.printStackTrace();
}
}
return "resul_"+nombreFileNotas;
}
public void EnviarArchivo
(String nombreArchivo
) {
try
{
// Creamos el archivo que vamos a enviar
if(!archivo.exists())
{
System.
out.
println("El archivo a "+nombreArchivo
+" no existe"); return ;
}
// Obtenemos el tamaño del archivo
int tamañoArchivo = (int)archivo.length();
File filenombreArchivo
= new File(nombreArchivo
);
// Creamos flujo de entrada para realizar la lectura del archivo en bytes
int i = 1;
pw1
= new PrintWriter(this.
socket.
getOutputStream(),
true);
System.
out.
println("El tamaño del archivo a enviar: "+tamañoArchivo
); /*
synchronized (pw1)
{
*/
while((buffer=br1.readLine())!=null)
{
pw1.println(buffer);
System.
out.
println(i
+") "+buffer.
length());
try {
Thread.
sleep(100);//le puse este sleep para depurar System.
out.
println("Excepcion del sleep()"); //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
}
i++;
}
// pw1.notify();
//}
fr.close();
}
{
System.
err.
println(e.
toString()); }
finally
{
try
{
br1.close();
//pw1.close();
}
Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void RecibirArchivo
(String nombreArchivo,
int tam
) {
try
{
int i = 1;
File filenombreArchivo
= new File(nombreArchivo
); this.socket.getInputStream()));
//synchronized (br2)
{
/* try {
br2.wait();
} catch (InterruptedException ex) {
Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
}*/
//br2.notify();
//socket.setSoTimeout(4* 1000);
while ((buffer = br2.readLine())!=null)
{
pw2.println(buffer);
System.
out.
println(i
+") "+buffer.
length()); try {
Thread.
sleep(100);//le puse este sleep solo para depurar System.
out.
println("Excepcion del sleep()"); //Logger.getLogger(DameFichero.class.getName()).log(Level.SEVERE, null, ex);
}
i++;
}
}
fw.close();
}
{
System.
out.
println("timout liberado"); //e.printStackTrace();
}
finally
{
pw2.close();
//br2.close();
}
}
}
El problema era que definía varios stream y lo asociaba a un mismo socket, ejemplo: declaraba un BufferOutputStream y un PrintWriter como flujos de salida y lo asociaba a un socket, ocasionando problemas en la conexión (pérdida de datos). El error no estaba en esa clase, sino en donde se instanciaba.