Pages: [1]   Go Down
Print
Author Topic: Come svolgerlo?  (Read 2801 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« on: 05-10-2011, 09:12:53 »

Code:
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",
scriva su console il valore ottenuto in risposta.
Logged
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #1 on: 07-10-2011, 09:56:35 »

Mi sono scervellato abbastanza, ho provato una soluzione di questo tipo, anche se non ho capito bene come testarla, per vedere se è davvero funzionante.
Comunque sia, eccola:

1 - Creazione dell'interfaccia
Code:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Interfaccia extends Remote
{
int hash (String str, int num) throws RemoteException;
        int ask (long IP, int port, String msg) throws RemoteException;
}

2 - Implementazione dei metodi nel server
Code:
mport java.rmi.*;
import java.rmi.server.*;
import java.io.*;
import java.net.*;

public class ServerImpl extends UnicastRemoteObject implements Interfaccia
{
public ServerImpl() throws RemoteException
{
super();
}

public int hash (String str, int num) throws RemoteException
{
int x=0;
                byte [] a=str.getBytes();
                for (int i=0; i<a.length; i++)
               {
                   x=x+a[i];
               }
return (x % num);
}
 
        public int ask (long IP, int port, String msg) throws RemoteException
       {
                int totale=0;
   
                // Creo la socket
                Socket socket=new Socket (IP, port, msg);
   
                // Creo gli stream
                BufferedReader in=new BufferedReader (new InputStreamReader(socket.getInputStream()));
                PrintWriter out=new PrintWriter (socket.getOutputStream(), true);
   
                // Invio al server la stringa richiesta
                out.print ("GET /msg\n\n");
                System.out.println ("Richiesta inviata al server");
                System.out.println ("In attesa di risposta");
                System.out.println ("Attendere prego...");
   
                // Calcolo il metoto hash(riga,30) su ogni riga
                String riga="";
                int [] valori;
                int i=0;
                while ((riga=in.readLine()) != null)
                {
                      valori[i]=hash (riga,30);
                      i++;
                }
   
                // Cerco il valore con maggiori occorrenze
                int max=0;
                int cont=0;
                for (int r=0; r<valori.length; r++)
               {
                     for (int c=0; c<valori.length; c++)
                    {
                          if (valori[r]==valori[c])
                         {
                               cont++;
                               if (cont > max)
                              {
                                   max=cont;
                                   totale=valori[r];
                              }
                         }
                    }
                    cont=0;
               }
   
         return totale;
       }
}

3 - Creazione dell' rmiRegistry
Code:
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.Naming;

public class Registry
{
public static void main (String [] args)
{
try
{
ServerImpl obj=new ServerImpl();
Naming.rebind ("alias_nome",obj);
System.out.println ("Server bound in the RMI registry");
}
catch (Exception e)
                {
System.out.println ("Errore: "+e.getMessage());
e.printStackTrace();
}
}
}

4 - Implementazione del Client
Code:
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.io.*;
import java.util.*;
import java.net.*;

public  class Client
{
public static void main (String [] args)
{
try
{
// Ottengo il riferimento alla funzione remota
System.out.println (Riferimento alla funzione remota...);
Interfaccia obj= (Interfaccia) Naming.lookup ("rmi://"+arg[0]+"/alias_nome");

// Invocazione del metodo remoto
System.out.println ("Invocazione del metodo remoto...");
int ris_invocazione=obj.ask ("151.97.252.4", 80, "GET /gp/prova18.aux");
System.out.println (ris_invocazione);
}

catch (Exception e)
{
System.out.println ("Errore: "+e.getMessage());
e.printStackTrace();
}
}
}

Che ne pensate?
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #2 on: 08-10-2011, 10:04:33 »

Interfaccia
Code:
int ask (long IP, int port, String msg) throws RemoteException;
IP è meglio salvarlo come stringa piuttosto come long, anche perché tu poi nel main del client gli passi una stringa!

Server
Quote
Socket socket=new Socket (IP, port ,msg);
in quale API di java è concessa una cosa del genere?

Code:
out.print ("GET /msg\n\n");
questo codice invia la stringa al server "GET /msg". Avresti dovuto mettere uno + quindi:

Code:
out.print ("GET /" + msg + "\n\n");
ma è sempre sbagliato perché msg contiene la stringa (presa dalla classe Client) "GET /gp/prova18.aux"
il codice corretto sarebbe
Code:
out.print (msg + "\n\n");


Per avviare il tutto:
1. Compila le classi
2. apri 3 prompt e digita in ognuno:
2.1 rmiregistry
2.2 java server
2.3 java client localhost

Logged

Diventa ciò che sei nato per essere
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #3 on: 08-10-2011, 11:27:53 »

Ho corretto gli errori, quello sulla stringa "msg" dovuto alla mia pigrizia e all'uso del copy/paste!
Le 4 classi compilano correttamente, ma in fase di esecuzione non si trovano ne java Server, e nemmeno java client localhost!
Grazie cmq per la tua disponibilità!!
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #4 on: 08-10-2011, 12:53:02 »

-.-'
Ho scritto la procedura generica per far funzionare il programma!
Devi scrivere i nomi esatti delle classi e quindi:
- rmiregistry
- java Registry
- java Client localhost

Ho dimenticato di dirti prima che il metodo hash dovrebbe darti qualche problema in quanto l'array valori non è stato inizializzato e non ha una dimensione fissa.
Logged

Diventa ciò che sei nato per essere
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #5 on: 08-10-2011, 13:34:44 »

-.-'
Ho scritto la procedura generica per far funzionare il programma!
Devi scrivere i nomi esatti delle classi e quindi:
- rmiregistry
- java Registry
- java Client localhost

Ho dimenticato di dirti prima che il metodo hash dovrebbe darti qualche problema in quanto l'array valori non è stato inizializzato e non ha una dimensione fissa.

Era sottintesa la procedura standard, è normale che l'ho provato con i nomi delle classi che ho creato io!
Per quanto riguarda l'array, ho risolto pure quell'aspetto!
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #6 on: 08-10-2011, 16:16:34 »

Non capisco il problema. Funziona quindi?
Logged

Diventa ciò che sei nato per essere
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #7 on: 09-10-2011, 12:15:08 »

Non capisco il problema. Funziona quindi?
Compila, ma non trova dal prompt le directory dove ci sono Registry e Client
Logged
Pages: [1]   Go Up
Print
Jump to: