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.
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:
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!