Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Tecniche di Programmazione Concorrente e Distribuita, 9 CFU => Topic started by: Shin on 26-12-2012, 17:37:02



Title: Soluzione esercizio 18
Post by: Shin on 26-12-2012, 17:37:02
Testo esercizio: http://www.dmi.unict.it/pappalardo/prova/18.html (http://www.dmi.unict.it/pappalardo/prova/18.html)

Nota: la stringa "GET /gp/prova/18.aux" va sostituita con "GET /pappalardo/prova/18.aux".

Quote
L'esercizio può essere svolto in C o Java.

Implementare due distinti servizi remoti (usando, a scelta dello studente, o RPC/C o RMI/Java per entrambi), che esportino, rispettivamente, le seguenti funzioni/metodi:

    hash(s,n) che, applicata a una stringa s, calcoli e restituisca la somma modulo n dei codici (ASCII o UniCode) dei caratteri di s;
    ask(ip,port,msg) che (in assenza di errori/eccezioni):
        apra una connessione su socket stream verso l'IP ip, port port
        invii sulla connessione la stringa msg, seguita da due "\n"
        applichi, a ogni riga s ricevuta in risposta man mano sulla connessione, la funzione/metodo remoto hash(s,30)
        restituisca il valore più frequente calcolato con hash() sulle varie righe ricevute.

Scrivere un client che, tramite la funzione/metodo remoto ask():

    apra una connessione di tipo stream verso l'IP 151.97.252.4, port 80, inviandogli la stringa "GET /gp/prova/18.aux" "GET /pappalardo/prova/18.aux",
    scriva su console il valore ottenuto in risposta.

Qualcuno mi aveva chiesto la soluzione a questo esercizio, trattandosi di un programma che tratta sia i socket che RMI, forse può essere utile a qualcuno.. perciò ecco il mio codice:

Interfaccia:
Code:
import java.rmi.*;

public interface es18 extends Remote
{
public int hash(String s, int n) throws RemoteException;
public int ask(String ip, int port, String msg) throws RemoteException;
}

Server:
Code:
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.net.*;
import java.io.*;

public class server implements es18
{
public int hash(String s, int n)
{
int somma = 0;

for (int i = 0; i < s.length(); i++)
somma += s.charAt(i);

return somma % n;
}

public int ask(String ip, int port, String msg)
{
try
{
InetAddress address = InetAddress.getByName(ip);
Socket client = new Socket(address, port);

BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);

String tmp;
out.println(msg+"\n\n");

// qualsiasi espressione del tipo (valore % 30) da un risultato compreso tra 0 e 29
// memorizzo in un array la frequenza di ciascun numero
int risultati[] = new int[30];

while ((tmp = in.readLine()) != null)
risultati[hash(tmp, 30)]++;

int maxfreq = 0;
int maxvalue = 0;
int i;


for (i = 0; i < 30; i++)
if (risultati[i] > maxfreq)
{
maxfreq = risultati[i];
maxvalue = i;
}

client.close();
return maxvalue;
}
catch(Exception e)
{
e.printStackTrace();
}

return 0;
}

public static void main(String args[])
{
try
{
server obj = new server();
es18 stub = (es18)UnicastRemoteObject.exportObject(obj, 0);

Registry reg = LocateRegistry.getRegistry("localhost");
reg.bind("es18", stub);

System.out.println("Server ready (CTRL-C quits)");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

Client:
Code:
import java.rmi.*;
import java.rmi.registry.*;

public class client
{
public static void main(String args[])
{
try
{
Registry reg = LocateRegistry.getRegistry("localhost");
es18 stub = (es18)reg.lookup("es18");

System.out.println(stub.ask("151.97.252.4", 80, "GET /pappalardo/prova/18.aux"));

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

Al solito, se avete qualche dubbio/suggerimento/critica/etc.. siete i benvenuti (altrimenti che senso avrebbe postarlo qui?  8:-) )


Title: Re:Soluzione esercizio 18
Post by: thomas89 on 27-12-2012, 14:38:32
praticamente ho svolto l'esercizio come hai fatto tu.. ovviamente cambiano i nomi delle classi come differenza sostanziale.. ma nn riesco ad eseguirlo.. mi da sempre errori... una volta compilati i 3 codici sorgenti, cosa fai? ps: ho scritto il tutto su eclipse io


Title: Re:Soluzione esercizio 18
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 27-12-2012, 14:44:38
praticamente ho svolto l'esercizio come hai fatto tu.. ovviamente cambiano i nomi delle classi come differenza sostanziale.. ma nn riesco ad eseguirlo.. mi da sempre errori... una volta compilati i 3 codici sorgenti, cosa fai? ps: ho scritto il tutto su eclipse io
La cosa interessante dei computer e dei compilatori è che non stampano semplicemente "errori! errori! ho trovato degli errori!", ma, inoltre, al contempo, ti dicono:
  • in che riga è l'errore;
  • a che carattere di quella riga è l'errore;
  • che tipo di errore è (eccezione o altro);
quindi, direi che il primo passo per risolverli sarebbe di postare quanto meno quali errori sono, e (se è il caso) il codice associato (tutto, non solo la riga errata .smile).


Title: Re:Soluzione esercizio 18
Post by: Shin on 27-12-2012, 14:54:51
praticamente ho svolto l'esercizio come hai fatto tu.. ovviamente cambiano i nomi delle classi come differenza sostanziale.. ma nn riesco ad eseguirlo.. mi da sempre errori... una volta compilati i 3 codici sorgenti, cosa fai? ps: ho scritto il tutto su eclipse io
La cosa interessante dei computer e dei compilatori è che non stampano semplicemente "errori! errori! ho trovato degli errori!", ma, inoltre, al contempo, ti dicono:
  • in che riga è l'errore;
  • a che carattere di quella riga è l'errore;
  • che tipo di errore è (eccezione o altro);
quindi, direi che il primo passo per risolverli sarebbe di postare quanto meno quali errori sono, e (se è il caso) il codice associato (tutto, non solo la riga errata .smile).

parole sante  :-OK :-OK :-OK


Title: Re:Soluzione esercizio 18
Post by: thomas89 on 27-12-2012, 15:21:47
...allora ho compilato il i 3 file .java, cioè l'interfaccia "RmiInterface", il server "server18" e il client "client18".... poi da terminale ho dato i comandi "rmiregistry &" e "java server18"... e proprio dopo quest'ultimo comando mi esce fuori:
Code:
tommaso@tommaso-net:~/Scrivania$ java server18
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: RmiInterface : Unsupported major.minor version 51.0

l'elenco non finisce qui, ma sono altri errori che non credo siano importanti... o quanto meno altri messaggi che ruoriescono a catena...


Title: Re:Soluzione esercizio 18
Post by: Shin on 28-12-2012, 10:13:22
...allora ho compilato il i 3 file .java, cioè l'interfaccia "RmiInterface", il server "server18" e il client "client18".... poi da terminale ho dato i comandi "rmiregistry &" e "java server18"... e proprio dopo quest'ultimo comando mi esce fuori:
Code:
tommaso@tommaso-net:~/Scrivania$ java server18
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: RmiInterface : Unsupported major.minor version 51.0

l'elenco non finisce qui, ma sono altri errori che non credo siano importanti... o quanto meno altri messaggi che ruoriescono a catena...

potresti postare il tuo codice?


Title: Re:Soluzione esercizio 18
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 28-12-2012, 10:24:08
...allora ho compilato il i 3 file .java, cioè l'interfaccia "RmiInterface", il server "server18" e il client "client18".... poi da terminale ho dato i comandi "rmiregistry &" e "java server18"... e proprio dopo quest'ultimo comando mi esce fuori:
Code:
tommaso@tommaso-net:~/Scrivania$ java server18
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: RmiInterface : Unsupported major.minor version 51.0

l'elenco non finisce qui, ma sono altri errori che non credo siano importanti... o quanto meno altri messaggi che ruoriescono a catena...
Quasi sicuramente stai usando più binari di Java nel tuo computer. In particolare potrebbe essere che stai compilando con una JDK versione più alta rispetto al binario JRE (incluso eventualmente in una seconda JDK) versione più bassa.

Prova a vedere con javac -v la versione di javac (JDK) e con java -v la versione di java (JRE), e magari con un colpo di which java e which javac vedi se i binari stanno nella stessa cartella (sento odore di alternatives...) .penso...


Title: Re:Soluzione esercizio 18
Post by: thomas89 on 28-12-2012, 12:15:19
potresti postare il tuo codice?

il codice fai conto che è uguale al tuo.. se vuoi lo posto...

Quasi sicuramente stai usando più binari di Java nel tuo computer. In particolare potrebbe essere che stai compilando con una JDK versione più alta rispetto al binario JRE (incluso eventualmente in una seconda JDK) versione più bassa.

Prova a vedere con javac -v la versione di javac (JDK) e con java -v la versione di java (JRE), e magari con un colpo di which java e which javac vedi se i binari stanno nella stessa cartella (sento odore di alternatives...) .penso...

avevo già controllato, per evitare ogni rimorso l'ho rifatto, ecco cosa spunta a video:
Code:
tommaso@tommaso-net:~$ javac -version
javac 1.7.0_09
tommaso@tommaso-net:~$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (7u9-2.3.3-0ubuntu1~12.04.1)
OpenJDK Server VM (build 23.2-b09, mixed mode)
tommaso@tommaso-net:~$ which java
/usr/bin/java
tommaso@tommaso-net:~$ which javac
/usr/bin/javac


Title: Re:Soluzione esercizio 18
Post by: Shin on 28-12-2012, 12:40:06
potresti postare il tuo codice?

il codice fai conto che è uguale al tuo.. se vuoi lo posto...

con il mio codice da lo stesso errore?


Title: Re:Soluzione esercizio 18
Post by: thomas89 on 28-12-2012, 13:29:00
potresti postare il tuo codice?

il codice fai conto che è uguale al tuo.. se vuoi lo posto...

con il mio codice da lo stesso errore?

si appena fatto: ecco i messaggi in output
Code:
tommaso@tommaso-net:~/Scrivania$ java server
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: es18 : Unsupported major.minor version 51.0
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:416)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at server.main(server.java:70)
Caused by: java.lang.UnsupportedClassVersionError: es18 : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:314)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:451)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:182)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1592)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1513)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)

stavolta li ho scritti tutti quanti  :boh


Title: Re:Soluzione esercizio 18
Post by: Shin on 28-12-2012, 13:35:45
potresti postare il tuo codice?

il codice fai conto che è uguale al tuo.. se vuoi lo posto...

con il mio codice da lo stesso errore?

si appena fatto: ecco i messaggi in output

...

beh almeno siamo sicuri che non dipende dal codice :S

purtroppo non so come aiutarti :(


Title: Re:Soluzione esercizio 18
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 28-12-2012, 17:09:31
Suggerisco la dis-installazione di OpenJDK e la installazione di SunOracle JDK.

O, se vuoi mantenerli entrambi, usa alternatives (ma non ti spiegherò come usarli :nono).


Title: Re:Soluzione esercizio 18
Post by: thomas89 on 31-12-2012, 11:53:30
Suggerisco la dis-installazione di OpenJDK e la installazione di SunOracle JDK.

O, se vuoi mantenerli entrambi, usa alternatives (ma non ti spiegherò come usarli :nono).

ahahah non c'è bisogno che non spieghi niente, conosco alternatives  :[Emoticon] PC Asd:
comunque in effetti il problema era proprio quello, le differenti versioni di java e javac  .whistling

adesso posso eseguire tutte le classi create, grazie  .ciaociao