Why is my socket paralyzed after loading a file?

1

Hi, I'm trying to make a socket that transfers files from the client to the server, it also makes queries to databases. I'm using threads but trying to load a file from the client to the server stays static and does not mark errors but does not execute anything else.

Server Codes:

package chatserver;

import java.net.*;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class ChatServerThread extends Thread {

private Socket socket = null;
private ChatServer server = null;
private int ID = -1;
private DataInputStream input = null;
private DataOutputStream output = null;
private BufferedInputStream bis;
private BufferedOutputStream bos;

public ChatServerThread(ChatServer _server, Socket _socket) {
    server = _server;
    socket = _socket;
    ID = socket.getPort();
}

public void enviar(String mensajes) {
    try {
        output.writeUTF(mensajes);
        output.flush();
    } catch (IOException ex) {
        System.out.println("[" + ID + "] ERROR enviando: " + ex.getMessage());
    }
}

public int getID() {
    return ID;
}

@Override
public void run() {
    System.out.println("Hello de servidor " + ID + " Corriendo...");
    while (true) {
        try {
            output.writeUTF("Nombre de usuario");
                output.flush();
            String request = input.readUTF();
            System.out.println(request);
            if (request != "") {
                output.writeUTF("Contraseña...");
                output.flush();
                String pass = input.readUTF();
                int checkOutput = Validar(request, pass);
                System.out.println(checkOutput + "\n");
                if (checkOutput == 0) {
                    output.writeUTF("Error usuario no existe...");
                    output.flush();
                } else {
                    String srtOutput = process(request);
                    output.writeUTF(srtOutput);
                    output.flush();
                }
            } else {
                output.writeUTF("No ingreso ningun dato...");
                output.flush();

            }

        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
            server.quitar(ID);
        }
    }
}

public void abrir() throws IOException {
    input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    output = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
}

public void cerrar() throws IOException {
    if (socket != null) {
        socket.close();
    }
    if (input != null) {
        input.close();
    }
    if (output != null) {
        output.close();
    }
}

public String process(String request) throws IOException {
    String continuar = "si";
    File folder = new File("Usuarios\" + request);
    if (folder.exists()) {
        System.out.println("La carpeta del usuario " + request + " ya existe ;D ");
    } else {
        folder.mkdir();
    }
    while (continuar.equals("si")) {
        output.writeUTF("Menu..." + "\n 1.- Agregar un archivo" + "\n 2.- Ver archivos guardados");
        output.flush();
        String Opcion = input.readUTF();
        int convertidor = Integer.parseInt(Opcion);
        switch (convertidor) {
            case 1:
                output.writeUTF("Selecciona un archivo");
                output.flush();
                String carga = CargarArchivo(request);
                output.writeUTF("Desea continuar? si ");
                output.flush();
                continuar = input.readUTF();
                break;
            case 2:
                String archivos = Archivos(request);
                output.writeUTF(archivos);
                output.flush();
                output.writeUTF("Desea continuar? si ");
                output.flush();
                continuar = input.readUTF();
                break;
            default:
                output.writeUTF("Error al elegir una opcion... \n");
                output.flush();
                output.writeUTF("Desea continuar? si ");
                output.flush();
                continuar = input.readUTF();
                break;
        }
    }
    return "Proceso terminado";
}

public String CargarArchivo(String carpeta) throws IOException {
    byte[] receivedData;
    int in;
    int Butcher = 0;
    String file;
    try {
        while (true) {
            receivedData = new byte[10240];
            bis = new BufferedInputStream(socket.getInputStream());
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            //Recibimos el nombre del fichero
            file = dis.readUTF();
            while (Butcher != -1) {
                Butcher = file.indexOf("\");
                file = file.substring(file.indexOf('\') + 1, file.length());
                System.out.println(file);
            }
            String query=agregarArchivo(carpeta,file);
            System.out.println(query);
            //Para guardar fichero recibido
            bos = new BufferedOutputStream(new FileOutputStream("Usuarios\" + carpeta + "\" + file));
            while ((in = bis.read(receivedData)) != -1) {
                System.out.println("Papel Atorado");
                bos.write(receivedData, 0, in);
            }
            System.out.println("Estamos por cerrar");
            bos.close();
            dis.close();
        }
    } catch (Exception e) {
        System.err.println(e);
    }
    return "";
}

public static int Validar(String usuario, String pass) {
    Connection con = null;
    Statement stmt = null;
    int contador = 0;
    System.out.println("\nConectamos");
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (java.lang.ClassNotFoundException err) {
        System.out.println("Clase no encontrada: " + err);
    }
    try {
        con = DriverManager.getConnection("jdbc:mysql://localhost/clienteservidor", "Rafael", "ClienteServidor");
        stmt = con.createStatement();
        String sentenciaSQL = "SELECT * FROM usuarios WHERE usuario='" + usuario + "' and pass='" + pass + "'";
        ResultSet rs = stmt.executeQuery(sentenciaSQL);
        System.out.println("--------------------------------");
        System.out.println("Usuario encontrado");
        System.out.println("--------------------------------");
        while (rs.next()) {
            System.out.println(rs.getString("usuario"));
            contador++;
        }
        rs.close();
        stmt.close();
        con.close();
        return contador;
    } catch (java.sql.SQLException error) {
        System.out.println("Se produjo error: " + error);
    }
    return 0;
}

public static String Archivos(String usuario) {
    Connection con = null;
    Statement stmt = null;
    String resultados="";
    System.out.println("\nConectamos");
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (java.lang.ClassNotFoundException err) {
        System.out.println("Clase no encontrada: " + err);
    }
    try {
        con = DriverManager.getConnection("jdbc:mysql://localhost/clienteservidor", "Rafael", "ClienteServidor");
        stmt = con.createStatement();
        String sentenciaSQL = "SELECT * FROM archivos WHERE usuario='" + usuario + "'";
        ResultSet rs = stmt.executeQuery(sentenciaSQL);
        System.out.println("--------------------------------");
        System.out.println("Usuario encontrado");
        System.out.println("--------------------------------");
        while (rs.next()) {
            System.out.println(rs.getString("archivo"));
                 resultados=resultados+"\n"+rs.getString("archivo");

        }
        rs.close();
        stmt.close();
        con.close();
            return resultados;
    } catch (java.sql.SQLException error) {
        System.out.println("Se produjo error: " + error);
    }
    return resultados;
}

public static String agregarArchivo(String usuario, String archivo) {
    Connection con = null;
    Statement stmt = null;
    int contador = 0;
    System.out.println("\nConectamos");
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (java.lang.ClassNotFoundException err) {
        System.out.println("Clase no encontrada: " + err);
    }
    try {
        con = DriverManager.getConnection("jdbc:mysql://localhost/clienteservidor", "Rafael", "ClienteServidor");
        stmt = con.createStatement();
        String sentenciaSQL = "INSERT INTO archivos(usuario,archivo) VALUES ('" + usuario + "','" + archivo + "')";
        int rs = stmt.executeUpdate(sentenciaSQL);
        stmt.close();
        con.close();
    } catch (java.sql.SQLException error) {
        System.out.println("Se produjo error: " + error);
    }
    return "Registrado";
    }

}

Another part of the Server Code:

package chatserver;

import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ChatServer implements Runnable{

private ServerSocket server = null;
private Thread thread = null;
private ChatServerThread clientes[] = new ChatServerThread[50];
private int cntClientes = 0;

public ChatServer(int puerto){
    try {
        System.out.println("Conectando con el puerto " + puerto + "..." );
        server = new ServerSocket(puerto);
        System.out.println("Iniciando servidor " + server);
        iniciarHilo();

    } catch (IOException ex) {
        System.out.println("Error: " + ex.toString() + ". Conexión terminada");
    }
}

private int encontrarClientes(int ID){
    for (int i = 0; i < cntClientes; i++) 
        if(clientes[i].getID() == ID)
            return i;        
    return -1;
}


public synchronized void handle(int ID, String input){
    if(input.equals(":q")){
        clientes[encontrarClientes(ID)].enviar(input);
        quitar(ID);
    }
    else
        for (int i = 0; i < cntClientes; i++) {
            clientes[i].enviar(ID + ": " + input);
        }
}

public synchronized void quitar(int ID){
    int pos = encontrarClientes(ID);
    if(pos >= 0){
        ChatServerThread toTerminate = clientes[pos];
        System.out.println("Removiendo cliente " + ID + " at " + pos);
            if(pos < cntClientes-1)
                for (int i = pos+1; i < cntClientes; i++)
                    clientes[i-1] = clientes[i];
            cntClientes--;
            try {
            toTerminate.cerrar();
        } catch (IOException ex) {
                System.out.println("ERROR: " + ex.getMessage());
        }
            toTerminate.stop();
    }
}

public void agregarHilo(Socket socket){
    if(cntClientes < clientes.length){
        System.out.println("Cliente aceptado: " + socket);
        clientes[cntClientes] = new ChatServerThread((this), socket);
        try {
            clientes[cntClientes].abrir();
            clientes[cntClientes].start();
            cntClientes++;
        } catch (IOException ex) {
            System.out.println("Error: " + ex.toString() + ". Conexion terminada ");
        }
    }
    else{
        System.out.println("Máximo de conexiones alcanzado ");
    }
}

public void iniciarHilo(){
    if(thread == null){
        thread = new Thread(this);
        thread.start();
    }
}

public void finalizarHilo(){
    if(thread != null){
        thread = null;
    }
}

public static void main(String[] args) {
    ChatServer srv = null;
    srv = new ChatServer(3001);
}



@Override
public void run() {
   while(thread != null){
       try {
           System.out.println("Esperando clientes...");
           agregarHilo(server.accept());
       } catch (IOException ex) {
           System.out.println("Error: " + ex.toString() + ". Conexion terminada");
       }
   }
}

}

Client codes:

package chatclient;
import java.net.*;
import java.io.*;
import java.util.Scanner;
import chatclient.ChatClientThread;

public class ChatClient implements Runnable {
private Socket socket = null;
private Scanner input = null;
private DataOutputStream output = null;
private ChatClientThread client = null;
private Thread hilo = null;



public ChatClient(String nombreServidor, int puertoServidor){
System.out.println("Estableciendo conexion... ");
try {
    socket = new Socket(nombreServidor, puertoServidor);
    System.out.println("Conectando con " + socket);
    iniciar();
} catch (IOException ex) {
    System.out.println("ERROR: " + ex.toString());
}
}

public void iniciar() throws IOException{
input = new Scanner(System.in);
output = new DataOutputStream(socket.getOutputStream());
if(hilo == null){
    client = new ChatClientThread(this, socket);
    hilo = new Thread(this);
    hilo.start();
}
}

public void finalizar(){
if(hilo!=null){
    hilo.stop();
    hilo = null;
}

try {
    if(input != null) input.close();
    if(output != null) output.close();
    if(output != null) socket.close();

} catch (IOException ex) {
    System.out.println("ERROR al finalizar: " + ex.toString());
}
client.cerrar();
client.stop();
}

public void handle(String mensaje){
    if(mensaje.equals(":q")){
        System.out.println("Hasta luego! Presiona ENTER para salir ...");
        finalizar();
    }
    else
        System.out.println(mensaje);
}

public static void main(String[] args) {
    ChatClient cliente = null;
    cliente = new ChatClient("127.0.0.1",3001);
}

@Override
public void run() {
    while(hilo != null){
        try {
            output.writeUTF(input.nextLine());
            output.flush();
        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
            finalizar();
        }
    }
}

}

More part of the client code:

package chatclient;

import java.net.*;
import java.io.*;

public class ChatClientThread extends Thread {

private Socket socket = null;
private ChatClient cliente = null;
private DataInputStream input = null;
private BufferedInputStream bis;
private BufferedOutputStream bos;

public ChatClientThread(ChatClient _client, Socket _socket) {
    cliente = _client;
    socket = _socket;
    abrir();
    start();
}

public void abrir() {
    try {
        input = new DataInputStream(socket.getInputStream());
    } catch (IOException ex) {
        System.out.println("ERROR al abrir: " + ex.getMessage());
        cliente.finalizar();
    }

}

public void cerrar() {
    try {
        if (input != null) {
            input.close();
        }
        {
        }
    } catch (IOException ex) {
        System.out.println("Error cerrando el stream: " + ex.toString());
    }
}

@Override
public void run() {
    while (true) {
        try {
           String request = input.readUTF();
            System.out.println(request);
            if (request.equals("Selecciona un archivo")) {
                System.out.println("Agrega el path del archivo que deseas cargar");
                String result = CargarArchivo();
                System.out.println(result);
            }
        } catch (IOException ex) {
            System.out.println("ERROR: " + ex.getMessage());
            cliente.finalizar();
        }
    }
}

public String CargarArchivo() throws IOException {
    int in;
    byte[] byteArray;
    String filename = input.readUTF();

    try {
        final File localFile = new File(filename);
        bis = new BufferedInputStream(new FileInputStream(localFile));
        bos = new BufferedOutputStream(socket.getOutputStream());
        //Enviamos el nombre del fichero
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(localFile.getName());
        //Enviamos el fichero
        byteArray = new byte[10240];
        while ((in = bis.read(byteArray)) != -1) {
            bos.write(byteArray, 0, in);
        }
        bis.close();
        bos.close();

    } catch (Exception e) {
        System.err.println(e);
    }
    return "Cargado...";
}

}
    
asked by Rafa 16.03.2018 в 16:29
source

0 answers