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...";
}
}