Pages: [1]   Go Down
Print
Author Topic: Prova 14  (Read 2319 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Alex_47
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 409


The spiral's King


« on: 17-01-2012, 15:45:37 »

Qualcuno è riuscito a fare la prova14 , se si , potrebbe postare la soluzione?
Logged
Giuseppe Pappalardo
Moderator
Apprendista Forumista
*****
Offline Offline

Posts: 398


« Reply #1 on: 17-01-2012, 16:55:32 »

Se volete la facciamo domani a lezione.
Logged
Nyconator
Apprendista Forumista
**
Offline Offline

Posts: 130


« Reply #2 on: 18-01-2012, 12:54:39 »

l'ho appena fatta in java... però non posso assicurarti che sia corretta, il server ancora non funziona purtroppo...

Code:
/* per ogni interfaccia remota definita (nel nostro semplice caso, soltanto una)
è necessario creare una classe (questa per l'appunto) sul server che contenga l'implementazione
dell'oggetto remoto vero e proprio.

tale classe deve

- Derivare dalla classe java.rmi.server.UnicastRemoteObject
- implementare TUTTI i metodi definiti nell'interfaccia remota (ma questa è una regola sempre valida in java)
- TUTTI i costruttori definiti nella classe devono lanciare un'eccezione del tipo java.rmi.RemoteException. Si noti che se si decidesse di utilizzare soltanto il costruttore di default, sarà
comunque necessario scriverne il codice per gestire proprio la throw dell'eccezione RemoteException

*/

import java.net.MalformedURLException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class prova14_applicazione_server extends UnicastRemoteObject implements prova14_interfaccia
{

public prova14_applicazione_server () throws RemoteException //costruttore della classe
{
}

public int validate (int [] riga)
{
int [] controllo = {0,0,0,0,0,0,0,0,0};

for (int i = 0; i<riga[i]; i++)
{
controllo [riga[i]] ++;
if (controllo[riga[i]] > 1)
return 0;
}

return 1;
}









//adesso il MAIN


public static void main (String [] args)
{

try
{
prova14_interfaccia server = new prova14_applicazione_server ();  //è così che si istanzia l'oggetto remoto

Naming.rebind ("//localhost/prova14", server);

/* viene effettuato il bind dell'oggetto server (di tipo interfaccia_remota) con il nome "prova9".

Si noti che per semplicità abbiamo inserito il main all'interno della classe RMISquareRootServer
ma, se avessimo voluto scrivere in modo più "pulito", avremmo potuto implementare una classe a parte solo per eseguire il main.

Si faccia, altresì, attenzione al fatto che è stato utilizzato l'indirizzo localhost che, nel caso in cui l'applicazione Server si fosse trovata
su una workstation separata, avrebbe dovuto essere sostituito dall'indirizzo IP di tale macchina.*/

}

catch (RemoteException e)
{
e.printStackTrace();
}

catch (MalformedURLException e)
{
e.printStackTrace();
}
}
}



Code:
/*
14.HTML - SETTEMBRE 2010
Prima parte
Scrivere un client che, tramite socket (C o Java):
1.Apra una connessione verso l'IP 192.168.0.34 port 80
2.Invii al server la stringa "GET /gp/prova/14.aux\n"
3.Analizzi lo stream ricevuto per:
identificare una sequenza di 9 righe consecutive che contengono esattamente 9 numeri ciascuna,
memorizzare localmente le nove stringhe identificate.
I 9x9 numeri così memorizzati rappresentano una configurazione finale di una partita a Sudoku.
4.Controlli la validità delle nove righe tramite una apposita funzione validate() che:
Verifichi che ogni riga sia una permutazione dei numeri da 1 a 9
Scriva su console quante righe risultano non valide (cioe' quante righe non sono una permutazione).*/


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

public class prova14_applicazione_client
{



public static void main (String [] args)
{

InetAddress indirizzo = null;
byte [] IP = {(byte)151,(byte)97,(byte)252,(byte)4};
int port = 80;


try
{
indirizzo = InetAddress.getByAddress(IP);
}

catch (Exception e)
{
System.out.println("errore");
e.printStackTrace();
}

Socket socket = null;

try
{
socket = new Socket (indirizzo, port);
}

catch (Exception e)
{

e.printStackTrace();
}


BufferedReader in = null;
PrintWriter out = null;

try
{
in = new BufferedReader (new InputStreamReader(socket.getInputStream()));
out = new PrintWriter((new BufferedWriter (new OutputStreamWriter (socket.getOutputStream()))), true);
}

catch (Exception e)
{
e.printStackTrace();
}

out.println("GET /gp/provaTPCD/14.aux\n");
String lettura = "";
String [] righeConNumeri = new String [9];

int j = 0;

while (j<9)

{

try
{
lettura = in.readLine();

for (int i = 0; i<9; i++)
{
if ((lettura.charAt(i) - '0' )> 0 && (lettura.charAt(i) - '0') <10)
{
System.out.println("la riga in lettura contiene " + i + " numeri consecutivi");

if (i == 8)
{
System.out.println ("la riga è stata memorizzata");
righeConNumeri [j] = lettura;
j++;
}

}
else
i = 9;



}
}
catch (Exception e)
{
e.printStackTrace();
}

}

int [] [] partitaSudoku = new int [9] [9];

for (int i = 0; i < 9 ; i++)
{


for (int c = 0; c <9 ; c++)
{
partitaSudoku  [i] [c]= Integer.parseInt(righeConNumeri [c]);
}
}

int result =0;

try
{
//faccio il LOOKUP (la ricerca) dell'oggetto remotizzato  sulla macchina il cui indirizzo è localhost
prova14_interfaccia provaServer = (prova14_interfaccia) Naming.lookup ("rmi://localhost/prova14");

for (int i = 0; i<9; i++)
{
result = provaServer.validate(partitaSudoku [i]);
System.out.println("Il risultato restituito dal server per la riga " + i + " è " + result);
}

}

catch (Exception e)
{
e.printStackTrace();
}













}







}




Code:

import java.rmi.Remote;
import java.rmi.RemoteException;

/*
Seconda parte (facoltativa)
Implementare in C/RPC o Java/RMI una funzione remota, che possa essere usata (cioè invocata) dal client scritto per la prima parte, per la validazione del punto 4 della prima parte.
È quindi richiesta una funzione/metodo remota/o validate() con:
input alla funzione: stringa di 9 numeri (compresi tra 1 e 9)
output da restituire:
1 (se la riga è una permutazione)
0 (se ci sono ripetizioni di un numero)*/

//definisco l'interfaccia

public interface prova14_interfaccia extends Remote
{

//adesso definisco il metodo
int validate (int [] riga) throws RemoteException;

//ovviamente senza corpo
}





qualcuno può confermare la (s)correttezza dell'esercizio?
Logged
Nyconator
Apprendista Forumista
**
Offline Offline

Posts: 130


« Reply #3 on: 18-01-2012, 13:04:03 »

PS: si è saputo poi qualcosa dell'utilissimo server online per gli esercizi? risulta ancora down ed è impossibile verificarne l'esito..
Logged
MissCooper
Apprendista Forumista
**
Offline Offline

Posts: 181



« Reply #4 on: 18-01-2012, 13:12:01 »

Il server attualmente è funzionante...
Logged
Nyconator
Apprendista Forumista
**
Offline Offline

Posts: 130


« Reply #5 on: 18-01-2012, 13:18:46 »

chiedo venia, il server funziona

non funziona il mio programma da un certo punto in poi, adesso controllo
Logged
Nyconator
Apprendista Forumista
**
Offline Offline

Posts: 130


« Reply #6 on: 18-01-2012, 13:49:29 »

ok... corretto: c'è un errore nella parte server, al controllo dell'array in parametro va in OutOfBound perchè l'indice deve essere riga - 1

sempre nella parte server, nel ciclo for inoltre deve essere i<riga.length

se serve lo riposto tutto 
Logged
equivoco
Matricola
*
Offline Offline

Posts: 69


« Reply #7 on: 20-01-2012, 11:24:30 »

ciao grazie 1000 per la soluzione...
mi spiegheresti come farla funzionare?
grazie
Logged
Datrix
Apprendista Forumista
**
Offline Offline

Posts: 130



« Reply #8 on: 20-01-2012, 13:46:50 »

Questa è la mia soluzione:

Code: (Client.java)
import java.io.*;
import java.net.*;
import java.rmi.*;

public class Client
{
private static boolean isNumber(String a)
{
try 

int i = Integer.parseInt(a); 

catch(NumberFormatException ex)  { return false; } 
return true;
}

private static int validate(String a)
{
int lunghezza= a.length();
for(int i=0; i<lunghezza; i++)
for(int j=i+1; j<lunghezza; j++)
if(Integer.parseInt(""+a.charAt(i))==Integer.parseInt(""+a.charAt(j)))
return 1;
return 0;
}



public static void main (String [] args) throws Exception
{
InetAddress addr=InetAddress.getByName("151.97.252.4");
Socket s=new Socket (addr,80);

InputStreamReader isr = new InputStreamReader (s.getInputStream());
BufferedReader br = new BufferedReader (isr);

OutputStreamWriter osw = new OutputStreamWriter (s.getOutputStream());
BufferedWriter bw= new BufferedWriter (osw);
PrintWriter out = new PrintWriter (bw,true);

out.println ("GET /gp/provaTPCD/14.aux\n");

String msg="";
int lunghezza=0;
int [] sudoku = new int [9];
int x=0;
int nonValide=0;

String url="rmi://localhost/validate";
RmtValidate r=(RmtValidate) Naming.lookup(url);

for (int i=0 ; (msg=br.readLine())!=null ; i++)
{

if (isNumber(msg) == true)
{
sudoku[x] = Integer.parseInt(msg);
x++;
if (r.validate(msg) ==1)
nonValide++;
}

}
System.out.println ("Righe non valide: "+nonValide);

}
}


Code: (Server.java)
import java.rmi.*;
public class Server
{
public static void main (String[] args)
{
try
{
RmtValidateImpl rii=new RmtValidateImpl();
Naming.bind("validate",rii);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

Code: (RmtValidate.java)
public interface RmtValidate extends java.rmi.Remote
{
public int validate(String a) throws java.rmi.RemoteException;
}


Code: (RmtValidateImpl.java)
public class RmtValidateImpl extends java.rmi.server.UnicastRemoteObject implements RmtValidate
{
public RmtValidateImpl() throws java.rmi.RemoteException
{
super();
}
public int validate(String a) throws java.rmi.RemoteException
{
int lunghezza= a.length();
for(int i=0; i<lunghezza; i++)
for(int j=i+1; j<lunghezza; j++)
if(Integer.parseInt(""+a.charAt(i))==Integer.parseInt(""+a.charAt(j)))
return 1;
return 0;
}
}

Essendo nel file del server in remoto tutte permutazioni, l'output sarà sempre Righe non valide: 0


Comandi per la compilazione:

javac Server.java
javac RmtValidate.java
javac RmtValidateImpl.java
javac Client.java
rmic RmtValidateImpl       //creazione Stub


Comadi per l'esecuzione dell'Rmi, sever locale, client (da avviare nell'ordine)

rmiregistry    //avvio RMI
java Server
java Client
« Last Edit: 20-01-2012, 13:55:51 by Datrix » Logged
francesco89b
Apprendista Forumista
**
Offline Offline

Posts: 169



« Reply #9 on: 20-01-2012, 16:38:08 »

A che sono qui sul forum tanto vale anche chiedere se a voi risulta uguale l'es 14

a me cm stringhe da

426583791
581679234
397412586
643195827
975824613
218736459
164358972
752961348
839247165

e sia la validazione "locale" che quella rmi mi da che nn ci sn ripetizioni, e salvo errori nelle righe non ci dovrebbero essere ripetizioni D
Logged

Ogni mia affermazione è sempre da considerarsi con un ampio margine di errore X0
Datrix
Apprendista Forumista
**
Offline Offline

Posts: 130



« Reply #10 on: 20-01-2012, 16:54:54 »

A che sono qui sul forum tanto vale anche chiedere se a voi risulta uguale l'es 14

a me cm stringhe da

426583791
581679234
397412586
643195827
975824613
218736459
164358972
752961348
839247165

e sia la validazione "locale" che quella rmi mi da che nn ci sn ripetizioni, e salvo errori nelle righe non ci dovrebbero essere ripetizioni D

come spercificato sopra:

Essendo nel file del server in remoto tutte permutazioni, l'output sarà sempre Righe non valide: 0

 
Logged
francesco89b
Apprendista Forumista
**
Offline Offline

Posts: 169



« Reply #11 on: 20-01-2012, 17:26:56 »

per le permutazioni ok, ma volevo sapere se anche a voi vi erano uscite queste 9 stringhe Wink
Logged

Ogni mia affermazione è sempre da considerarsi con un ampio margine di errore X0
Datrix
Apprendista Forumista
**
Offline Offline

Posts: 130



« Reply #12 on: 20-01-2012, 18:54:17 »

per le permutazioni ok, ma volevo sapere se anche a voi vi erano uscite queste 9 stringhe Wink

sul file che è nel server solo quelle ci sono, ne volevi altre? Smiley
Logged
francesco89b
Apprendista Forumista
**
Offline Offline

Posts: 169



« Reply #13 on: 20-01-2012, 20:26:24 »



sul file che è nel server solo quelle ci sono, ne volevi altre? Smiley

magari nascoste ce ne stavano altre XD
Logged

Ogni mia affermazione è sempre da considerarsi con un ampio margine di errore X0
Pages: [1]   Go Up
Print
Jump to: