Salve a tutti per un progetto di Ingegneria del Software ho bisogno di creare una connessione Client/Server tra un'applicazione client ed il server dove risiede il DB MySql.
Ho pensato quindi di utilizzare la comunicazione RMI e permettere al client di utilizzare i metodi select(String query) e modificaDatabase(String query)
entrambi i quali sono metodi di un oggetto memorizzato nel server
I problemi li ho all'avvio del programma server e quindi anche all'avvio del client (il quale non trova il bind della classe sul server)
Innanzitutto da terminale do:
All'avvio da eclipse del server invece ho questo errore dato dal printStackTrace (metto solo le prime righe)
codice:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: util.server.InterfacciaServer
Dato che non sono molto pratico di questo protocollo C/S vorrei chiedere a qualche esperto se possa darmi una mano nel capire l'errore
Ora posto tutte le classi:
Main(Server)
codice:
public static void main(String[] args)
{
try
{
InterfacciaServer server = new MySqlServer("password","agroludos");
Naming.rebind("//localhost/MySql", server);
}
catch (RemoteException e){e.printStackTrace( );}
catch (MalformedURLException e) {e.printStackTrace( );}
catch (ClassNotFoundException e)
{
System.out.println("Driver mysql non trovato");
}
catch(SQLException e)
{
System.out.println("Errore con il database");
}
}
MySqlServer
codice:
public class MySqlServer extends UnicastRemoteObject implements InterfacciaServer
{
private String user;
private String pwd;
private String nomeDB;
private String indirizzoIP;
private Connection conn;
public MySqlServer(String user,String pwd, String nomeDB, String indirizzoIP)
throws ClassNotFoundException, SQLException, RemoteException
{
this.user = user;
this.pwd = pwd;
this.nomeDB = nomeDB;
this.indirizzoIP = indirizzoIP;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://" + indirizzoIP +"/"+
nomeDB+"?user="+user+"&password="+pwd);
}
public MySqlServer(String pwd, String nomeDB)
throws ClassNotFoundException, SQLException, RemoteException
{
this("root", pwd, nomeDB, "127.0.0.1");
}
public RisultatoQuery select(String query)
throws SQLException, MySQLSyntaxErrorException, RemoteException
{
LinkedList<LinkedList<String>> matriceRisultati = new LinkedList<LinkedList<String>>();
LinkedList<String> record;
RisultatoQuery risultatoQuery = new RisultatoQuery();
Statement stmt = conn.createStatement();
ResultSet resultSet;
ResultSetMetaData rsmt;
stmt.executeQuery(validaStringaQuery(query));
resultSet = stmt.getResultSet();
rsmt = resultSet.getMetaData();
while(resultSet.next())
{
record = new LinkedList<String>();
for(int i = 0; i < rsmt.getColumnCount(); i++)
record.add(resultSet.getString(i+1));
matriceRisultati.add(record);
}
stmt.close();
risultatoQuery.assegnaRisultato(matriceRisultati);
return risultatoQuery;
}
public synchronized void modificaDatabase(String query)
throws SQLException, MySQLSyntaxErrorException, RemoteException
{
Statement stmt = conn.createStatement();
stmt.executeUpdate(validaStringaQuery(query));
stmt.close();
}
private String validaStringaQuery(String query)
{
if((query.charAt(query.length() -1)) != ';')
query += ';';
return query;
}
}
InterfacciaServer
codice:
public interface InterfacciaServer extends Remote
{
RisultatoQuery select(String query)
throws RemoteException, SQLException, MySQLSyntaxErrorException;
void modificaDatabase(String query)
throws RemoteException, SQLException, MySQLSyntaxErrorException;
}
Main(Client)
codice:
public static void main(String[] args)
{
try
{
InterfacciaServer mySqlServer =
(InterfacciaServer)Naming.lookup("rmi://192.168.0.5/MySql");
RisultatoQuery rq = mySqlServer.select("SELECT* FROM prova;");
for(int i = 0; i < rq.getRows(); i++)
{
for(int j = 0; j < rq.getColumns(); j++)
System.out.print(rq.getElement(i, j) + " ");
System.out.println();
}
}
catch(RemoteException e)
{
e.printStackTrace();
}
catch(MySQLSyntaxErrorException e)
{
System.out.println(e.getMessage());
}
catch(SQLException e)
{
System.out.println("Errore con il database...");
}
catch(MalformedURLException e)
{
System.out.println("Indirizzo ip errato...");
}
catch (NotBoundException e)
{
e.printStackTrace();
}
}
Come sistema operativo uso Ubuntu 14.04 in entrambi i pc. L'IDE è Eclipse 3.8 e il JDK è l'1.7