Pages: [1] 2   Go Down
Print
Author Topic: Prova laboratorio numero 7  (Read 3812 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« on: 30-12-2011, 14:26:50 »

Salve ragazzi, ho provato a fare la prova di laboratorio numero 7 e volevo un vostro parere sulla correttezza del codice.

testo:
Scrivere in C o Java un programma che:
1) apra una connessione verso l'IP 192.168.0.34, port 80
2) invii la stringa "GET /gp/prova/07.aux\n"
3) nello stream di byte ricevuti, cerchi il primo contenente il carattere '-' e memorizzi quindi i successivi 31 byte
4) scriva questi 31 byte sulla standard output


codice:
Code:
import java.net.*;
import java.io.*;

public class prova7
{
public static void main(String [] args)
{
//1) primo punto
InetAddress ad = InetAddress.getByName("192.168.0.34");

Socket s = new Socket(ad, 80);

//input e output
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader in = new BufferedReader(isr);

OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);

PrintWriter out = new PrintWriter(bw);


//2) secondo punto
out.println("GET /gp/prova/07.aux\n");

//3) terzo punto
int count=0;
String fromServer=null;
String str=null;
for (int i=0; (fromServer=in.readLine())!=null; i++)
{
for (int x=0; x<fromServer.length(); x++)
{
if ((fromServer.charAt(x))=='-')
{
for (int p=x; p<=31; p++)
{
str+=fromServer.charAt(p);
}
break;
}
}
}

//4)quarto punto
System.out.println(str);
}
}

Il mio problema è che se il carattere trovato si trovasse alla fine di una riga allora questo esempio non funzionerebbe...
Aspetto vostre risposte e buon anno a tutti!
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #1 on: 30-12-2011, 18:22:00 »

Potresti ovviare utilizzando il metodo read() al posto del metodo readLine() (praticamente al posto di leggerti la riga di un file ti legge ogni singolo carattere). In questo modo (col metodo read()) leggi ogni singolo carattere del file ricevuto (senza preoccuparti che sia  primo carattere , ultimo carattere, non importa in questo caso). Ti basta controllare che sia diverso da '-'. Se dovesse essere uguale a '-' allora leggi (sempre con read) i successivi 31 byte. Io l'ho risolto così .Credo funzioni in ogni circostanza.
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #2 on: 30-12-2011, 18:51:41 »

Grazie della risposta ora ci provo. Comunque potresti postare il codice relativo a questo esercizio cosi li confrontiamo.
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #3 on: 30-12-2011, 19:08:13 »

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

public class prova7{
   public static void main(String [] args){
      try{
         // Creazione socket e connessione
         byte[] b={(byte)151, (byte)97, (byte)252, (byte)4};
         InetAddress ad= InetAddress.getByAddress(b);
         Socket s= new Socket(ad,80);
         System.out.println("Connesso al server...");
         
         //Stream input. Qui ricevo dal server
         InputStreamReader isr= new InputStreamReader(s.getInputStream());
         BufferedReader in= new BufferedReader(isr);
         
         //Stream output. Qui inserirò i dati da inviare al server
         OutputStreamWriter osr= new OutputStreamWriter(s.getOutputStream());
         BufferedWriter ou= new BufferedWriter(osr);
         PrintWriter out= new PrintWriter(ou,true);
         
         out.println("GET /gp/provaTPCD/07.aux\n");
         System.out.println("Richiesta inviata.");
         
         String fromServer="";
         int c=0;
         while((c=in.read())!='-'){
            //non occorre far nulla, sto scorrendo l'output ricevuto.
         }
         
         for(int i=0;i<31;i++){
            fromServer+=(char)in.read();
         }
         
         System.out.println(fromServer);
         
         s.close();
         in.close();
         ou.close();
         out.close();
         
      }
      
      catch (Exception e){
      }
   }
}
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #4 on: 30-12-2011, 19:27:40 »

Grazie di averlo postato ma per caso lo hai provato con un server creato da te?
perchè questo indirizzo ip non funziona e non possiamo sapere se quello che scriviamo sia giusto...Sad
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #5 on: 30-12-2011, 20:09:58 »

L'ip presente nel testo non è giusto mentre quello che ho inserito io è quello corretto.. l'ultima lezione me lo sono fatto dire Smiley Cmq è sbagliato anche il percorso del file (presente nel testo). Utilizza quello presente nel codice che ho postato! (anche quello l'ho chiesto a lezione) Smiley
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #6 on: 30-12-2011, 20:30:55 »

Grazie dell'info ma l'ip e il percorso valgono anche per gli altri esercizi presenti sul sito?
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #7 on: 31-12-2011, 13:34:01 »

A quanto pare si... a me con quei dati funzionano Smiley
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #8 on: 31-12-2011, 14:06:25 »

Ma invece per quanto riguarda le rmi hai fatto qualcosa? potresti postare un esempio di implementazione? 
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #9 on: 31-12-2011, 15:37:01 »

Allora è un po macchinoso(e non sono sicuro al 100% che tutto ciò sia giusto, quindi in caso qualcosa dovrebbe essere scorretta ditemelo):
Prima è necessario implementare un interfaccia con i metodi remoti da implementare.

import java.rmi.*;
public interface serverInterface extends Remote{
   public int hash(String s)throws RemoteException;
}

//

Fatto ciò bisogna creare una classe che estenda UnicastRemoteObject e implementi l'interfaccia di sopra.


import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class server extends UnicastRemoteObject implements serverInterface{
   public int hash(String s){
      int n=26;
      int c=0;
      for(int i=0;i<s.length();i++){
         c+=s.charAt(i);
      }
      
      return c%n;
   }
   
   public server()throws RemoteException{
   }
   
      
   // Il main lo faccio nello stesso file
   
   public static void main(String [] args)throws Exception{
      System.setProperty("java.security.policy","policy.txt");
      System.setSecurityManager(new RMISecurityManager());
      server server1=new server();
      Naming.rebind("localhost/server",server1);
      System.out.println("Server pronto...");
   }
}

//

Infine bisogna implementare un client che utilizza questi metodi remoti

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

public class client{
   public static void main(String [] args)throws Exception{
      System.setProperty("java.security.policy","policy.txt");
      System.setSecurityManager(new RMISecurityManager());
      
      serverInterface Server=(serverInterface)Naming.lookup("localhost/server");
      
      System.out.println(Server.hash("ciaociao"));
         
   }
}

Inoltre per farlo funzionare correttamente è stato necessario inserire un file.txt che io ho chiamato policy.txt nella stessa cartella dove risiedono gli altri file.
Praticamente questo file deve contenere le seguenti righe:

grant {
permission java.security.AllPermission;
};

Tale file serve per la gestione dei permessi, cioè una sorta di regola (in linea di massima).

Fatto ciò devi compilare i vari file e inoltre dal prompt compila il server.java tramite "rmic server.java" in tal modo sarà generato il file stub (sempre all'interno dove sono presenti gli altri file).

Sempre dal prompt: start rmiregistry(NB: rmiregistry deve rimanere attivo finché vuoi utilizzare il programma).

Adesso puoi avviare il client e vedi che funziona.

In questo modo io sono riuscito a farlo funzionare, anche se ho provato solo in locale.  Spero di essere stato chiaro 
Logged
Giovi89
Apprendista Forumista
**
Offline Offline

Posts: 273


« Reply #10 on: 31-12-2011, 18:19:31 »

Ciao e grazie di avermi postato questo esercizio. Ho provato a scriverlo per cercare di capire il funzionamento delle rmi però quando da terminale scrivo start rmiregistry mi dice che non trova il comando start; io uso un mac può essere che nel mac il comando per avviare il servizio sia diverso? Inoltre quando faccio rmic server mi genera lo stub del server ma per caso non dovrei fare rmic anche con il client?
p.s.
i comandi :
Code:
System.setProperty("java.security.policy","policy.txt");
      System.setSecurityManager(new RMISecurityManager());

sono dei comandi da mettere sempre in ogni esercizio rmi che facciamo?
Grazie in anticipo per eventuali risposte e buon anno! 
Logged
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #11 on: 02-01-2012, 02:19:54 »

rmic va fatto solo sul server. I comandi che hai scritto credo proprio che sono necessari quando si implementano della RMI .Riguardo il fatto che utilizzi mac, prova a dare rmiregistry senza start (in effetti start su windows fa in modo che rmiregistry venga effettuato su un nuovo prompt).
Logged
Vivynz
Forumista Eroico
*****
Offline Offline

Gender: Female
Posts: 2.033


File reality.sys corrupted, Reboot Universe? Y/N


« Reply #12 on: 03-01-2012, 11:34:50 »

qualcuno ha fatto la prova 5?ho dei problemi con la ricezione della seconda risposta dal server..
Logged

L'odrine delle lttere dnetro una praorla non è ipmortatne, la sloa cosa ipmortatne è che la pmria e l'utlima ltteera sinao nel potso giutso. Il rseto può essree in un dsiodrine più totlae e voi ptoerte smerpe lggeree sneza porblmea.
flashato90
Apprendista Forumista
**
Offline Offline

Posts: 122


WWW
« Reply #13 on: 03-01-2012, 14:16:15 »

Anche'io avevo lo stesso problema, ho risolto reinizializzando la socket, gli stream e gli oggetti bufferedreader/bufferedwriter.
Logged
Vivynz
Forumista Eroico
*****
Offline Offline

Gender: Female
Posts: 2.033


File reality.sys corrupted, Reboot Universe? Y/N


« Reply #14 on: 03-01-2012, 15:37:10 »

ma ci deve essere un modo migliore, così è un pò come aggirare il problema 
Logged

L'odrine delle lttere dnetro una praorla non è ipmortatne, la sloa cosa ipmortatne è che la pmria e l'utlima ltteera sinao nel potso giutso. Il rseto può essree in un dsiodrine più totlae e voi ptoerte smerpe lggeree sneza porblmea.
Pages: [1] 2   Go Up
Print
Jump to: