Pages: [1]   Go Down
Print
Author Topic: Problema esercizio, help me!  (Read 3444 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« on: 27-09-2011, 15:24:34 »

Salve a tutti, ho un problema con questo tipo di esercizi, nei quali mi blocco al momento di entrare dentro il ciclo per controllare e cercare la stringa richiesta.
Posto, a titolo di esempio, questo esercizio, dato che il tipo di problema che riscontro è sempre lo stesso.

Code:
Scrivere un programma (C o Java) che, dato un intero k, estragga la k-esima parola da un elenco e restituisca in output su console il numero di
occorrenze della parola estratta presenti in un file di testo.

In particolare il programma dovrà:

- Riconoscere il suo primo argomento sulla riga di comando come intero, sia k, compreso tra 1 e 100000.
- Effettuare una connessione con il server 192.168.0.34, port 80.
- Inviare al server la richiesta: "GET /pappalardo/prova/dizionario\n\n".
- Il testo ricevuto conterrà una lista di parole, una per riga: individuare e memorizzare la k-esima, sia w.
- Effettuare una nuova connessione con lo stesso server di cui al punto 2, inviargli la stringa “GET /pappalardo/prova/19.aux\n\n”
e analizzare lo stream ricevuto, contando il numero di occorrenze in esso della parola w.
- Scrivere sulla standard output il numero di occorrenze contate.

Nell'esercizio specifico, l'idea è quella di creare un buffer, dove memorizzo tutti i caratteri prima di uno spazio.
Quando incontro uno spazio, svuoto il buffer, e lo copio nella stringa w, se il count è uguale all'intero k.

Ho tentato questa soluzione dopo che, in un esercizio praticamente identico, ho riscontrato lo stesso problema con il comando readLine().

Inoltre:
- Per semplicità ho supposto k=2
- Ho lavorato su un host locale, con i file dizionario.txt e file.txt

Di seguito posto la mia soluzione, sperando si possa trovare l'errore:
Code:
import java.util.*;
import java.io.*;
import java.net.*;

public class clientMay11
{
public static void main (String [] args) throws Exception
{
// Inizializzo l'intero k
long k=2;

// Creo la socket
Socket socket=new Socket ("127.0.0.1",80);
System.out.println ("Client: E' iniziata la comunicazione!");

// Creo lo stream dei dati
BufferedReader in=new BufferedReader(new InputStreamReader (socket.getInputStream()));
PrintWriter out=new PrintWriter (socket.getOutputStream(), true);

// Invio al server la richiesta
out.print ("GET /dizionario.txt\n\n");

// Individuo e memorizzo la k-esima riga dal file, e la chiamo w
long count=1;
char c;
String buffer="";
String w="";
while ((c=(char)in.read()) != -1)
{
if (c==' ')
{
w=buffer;
buffer="";
count++;

if (count==2)
{
System.out.println (w);
break;
}
}
else
{
buffer=buffer+c;
}
}

// Chiudo gli stream e la socket
out.close();
in.close();
socket.close();

// Creo una nuova connessione verso lo stesso server
Socket socket1=new Socket ("127.0.0.1",80);
System.out.println ("Client: E' iniziata la comunicazione!");

// Creo lo stream dei dati
BufferedReader in1=new BufferedReader(new InputStreamReader (socket1.getInputStream()));
PrintWriter out1=new PrintWriter (socket1.getOutputStream(), true);

// Invio la nuova stringa al server
out1.print ("GET /file.txt\n\n");

// Analizzo lo stream ricevuto, contando le occorrenze di w
long count2=0;
String buffer1="";
String parola="";
char cc;
while ((cc=(char)in1.read()) != -1)
{
if (cc==' ')
{
parola=buffer1;
buffer1="";

if (parola==w)
{
count2++;
}
}
else
{
buffer1=buffer1+cc;
}
}

// Scrivo sulla standard output il numero di occorrenze trovate
System.out.println ("Nr. totale occorrenze: "+count2);

// Chiudo gli stream e la socket
out1.close();
in1.close();
socket1.close();
}
}

Inoltre ho qualche problema con la comprensione del fatto che noi inviamo al server una richiesta, e il server (come?) ci restituisce un output o un risultato

Spero qualcuno possa risolvere questi miei dubbi!
Vi ringrazio anticipatamente!
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #1 on: 27-09-2011, 16:37:44 »

Non ho visto tutto l'esercizio, cmq nel testo dell'esercizio è riportato la seguente:
Quote
- Il testo ricevuto conterrà una lista di parole, una per riga: individuare e memorizzare la k-esima, sia w.

Quindi è inutile (e alla base del compito pure sbagliato) controllarsi ogni carattere dello stream ricevuto.
Basta spostare il puntatore della BufferedReader k volte!
Quindi:
Code:
for (int i=0; i< k-1; i++) // mi fermo a k-1 perché il puntatore dopo la chiamata al metodo
   in.readLine();            // si sposterà alla riga successiva

w = in.readLine();
Logged

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

Posts: 232



« Reply #2 on: 28-09-2011, 08:12:39 »

Avevo pensato anche io ad un implementazione con readLine(), cosa più logica peraltro. Però non mi convince, in quanto di compilare compila, però in fase di esecuzione non da segni di vita, perde troppo tempo.

Nello specifico:
- Ho sostituito il while di prima, inserendo questo codice per la ricerca della stringa w
- Ho inserito una system per controllare se il blocco è prima di quel punto, come sembra.
Code:
String w="";
for (int i=0; i<k-1;i++)
{
     w=in.readLine();
}
System.out.println("La k-esima parola e': "+w);
Logged
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #3 on: 28-09-2011, 09:44:23 »

Ho tentato un'altra via, sempre con readLine()
Eccola:
Code:
String w="";
int cont=1;
String temp="";

while ((temp=in.readLine()) != null)
{
     if (cont==k)
     {
           w=temp;
           break;
     }
     else
     {
           temp="";
           cont++;
     }
}
System.out.println ("La k-esima parola e': "+w);

Ecco il file "dizionario" da cui ho avviato la lettura:
Code:
Prof
Pappalardo
Esame
Sistemi
Distribuiti
Ottobre
Dato k=2, avrei dovuto trovare la stringa "Pappalardo"
Però, dopo 5 minuti circa di esecuzione, come parola ricevo una stringa vuota!
Come può essere?
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #4 on: 28-09-2011, 10:18:08 »

Sei sicuro che il server ti invia lo stream?
Prova a stampare le varie readLine() vedi se leggi le stringhe...
Logged

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

Posts: 232



« Reply #5 on: 28-09-2011, 10:21:23 »

Sei sicuro che il server ti invia lo stream?
Prova a stampare le varie readLine() vedi se leggi le stringhe...
Le readLine() mi danno null, ne ho posizionata una proprio subito dopo la richiesta al server...
Come posso fare?
Grazie cmq per la pazienza Smiley
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #6 on: 28-09-2011, 10:26:31 »

Allora hai qualche problema nel server con l'invio dei dati al client. Controllalo e casomai posti il server
Logged

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

Posts: 232



« Reply #7 on: 28-09-2011, 10:37:00 »

Ma bisogna implementare solo il client,no?
Ho wamp, ed utilizzo localhost 127.0.0.1, ed i file "dizionario.txt" e "file.txt" sono contenuti nella cartella www.
Gia a me sembra strano che l'esecuzione duri cosi tanto!
Cmq posto tutto il codice scritto, che penso, al netto di questa mancata lettura dal server, sia corretto:

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

public class clientMay11
{
public static void main (String [] args) throws Exception
{
// Inizializzo l'intero k
int k=2;

// Creo la socket
Socket socket=new Socket ("127.0.0.1",80);
System.out.println ("Client: E' iniziata la comunicazione!");

// Creo lo stream dei dati
BufferedReader in=new BufferedReader(new InputStreamReader (socket.getInputStream()));
PrintWriter out=new PrintWriter (socket.getOutputStream(), true);

// Invio al server la richiesta
out.print ("GET /dizionario.txt\n");
System.out.println ("Client: E' stata inviata la richiesta al server");
System.out.println ("Attendere prego...");

// Individuo e memorizzo la k-esima riga dal file, e la chiamo w
String w="";
int cont=1;
String temp="";
while ((temp=in.readLine()) != null)
{
if (cont==k)
{
w=temp;
break;
}
else
{
System.out.println(temp);
temp="";
cont++;
}
}
System.out.println ("La k-esima parola e': "+w);

// Chiudo gli stream e la socket
out.close();
in.close();
socket.close();
System.out.println ("Client: Comunicazione chiusa!");
System.out.println ("---------------------------------------------");

// Creo una nuova connessione verso lo stesso server
Socket socket1=new Socket ("127.0.0.1",80);
System.out.println ("Client: E' iniziata la nuova comunicazione!");

// Creo lo stream dei dati
BufferedReader in1=new BufferedReader(new InputStreamReader (socket1.getInputStream()));
PrintWriter out1=new PrintWriter (socket1.getOutputStream(), true);

// Invio la nuova stringa al server
out1.print ("GET /file.txt\n");
System.out.println ("Client: E' stata inviata la richiesta al server");
System.out.println ("Attendere prego...");

// Analizzo lo stream ricevuto, contando le occorrenze di w
int cont1=0;
String c="";
while((c=in1.readLine()) != null)
{
if (c.equals(w))
{
cont1++;
}
else
{
c="";
}
}

// Scrivo sulla standard output il numero di occorrenze trovate
System.out.println ("Nr. totale occorrenze: "+cont1);

// Chiudo gli stream e la socket
out1.close();
in1.close();
socket1.close();
System.out.println ("Client: Comunicazione chiusa!");
}
}

Inoltre, per la seconda parte dell'esercizio, ho chiuso la connessione precedente e aperto una nuova: è giusto cosi,no?
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #8 on: 28-09-2011, 10:59:43 »

Non saprei dirti.. il client mi sembra corretto.. almeno per la prima parte.
Ti consiglio di implementare il server in java. In questo compito non te lo chiede, ma a volte come parte facoltativa ti chiede di implementare un metodo rmi quindi è bene imparare a scrivere pure il server.
Quindi o crei il server o sistemi wamp in questo caso.
Comunque, se non vado errato, se nel browser tu digiti
Code:
http://127.0.0.1:80/dizionario.txt
ti dovrebbe comparire il contenuto del dizionario.txt. E' così?
Logged

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

Posts: 232



« Reply #9 on: 28-09-2011, 11:20:40 »

Non saprei dirti.. il client mi sembra corretto.. almeno per la prima parte.
Ti consiglio di implementare il server in java. In questo compito non te lo chiede, ma a volte come parte facoltativa ti chiede di implementare un metodo rmi quindi è bene imparare a scrivere pure il server.
Quindi o crei il server o sistemi wamp in questo caso.
Comunque, se non vado errato, se nel browser tu digiti
Code:
http://127.0.0.1:80/dizionario.txt
ti dovrebbe comparire il contenuto del dizionario.txt. E' così?
Al momento ho staccato il pc, più tardi do un'occhiata e ti faccio sapere, ti ringrazio cmq per l'interesse!
Logged
TheSpecialOne
Apprendista Forumista
**
Offline Offline

Posts: 232



« Reply #10 on: 28-09-2011, 14:06:20 »

appena controllato, sul browser spunta tutto...
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #11 on: 28-09-2011, 15:05:50 »

Prova a cambiare questa riga
Code:
out.print ("GET /dizionario.txt\n");
in
Code:
out.println ("GET /dizionario.txt");

anche se mi sembra strano
Logged

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

Posts: 232



« Reply #12 on: 30-09-2011, 09:05:03 »

Niente da fare nemmeno cosi...
Invece se dovessero capitarmi esercizi di questo tipo:
Code:
PRIMA PARTE
Implementare in C/RPC o Java/RMI, su localhost, un servizio costituito da una funzione/metodo hash() che:
prende per unico argomento una stringa,
restituisce la somma dei codici ASCII dei caratteri dell'argomento stringa, modulo 26.
Scrivere un semplice cliente che invochi la funzione remota passandole come argomento il proprio cognome.

SECONDA PARTE
Scrivere in C o Java un programma cliente che:
apra una connessione verso l'IP 192.168.0.34, port 80,
invii a tale server la stringa "GET /gp/prova/09.aux\n",
nello stream testo ricevuto, legga il numero che rappresenta il (solo) contenuto della riga 12,
moltiplichi tale numero per il valore restituito dalla funzione remota hash(), eseguita su localhost e applicata al proprio cognome; sia n il risultato,
invii a 192.168.0.34, port 80 la stringa "GET /gp/prova/09b.aux\n",
dallo stream testo ricevuto, individui la riga n e ne scriva il contenuto sulla standard output.

Dovrei creare anche il server? come posso fare?
Logged
Pages: [1]   Go Up
Print
Jump to: