Pages: [1] 2   Go Down
Print
Author Topic: Problema Esercizio Laboratorio..  (Read 3686 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« on: 28-04-2011, 18:54:04 »

QUESTO E' IL TESTO
Scrivere in C o Java un programma che:

- apra una connessione verso lIP 151.97.252.4, port 80
- invii la stringa "GET /gp/prova/11.html\n"
- nello stream di byte ricevuti individui la prima parentesi quadra aperta
- memorizzi tutti i successivi byte fino alla prima parentesi quadra chiusa, che il server invierà, in una variabile stringa denominata "s"
- invii, sulla connessione già aperta, la stringa s (attenzione: dovrebbe terminare per "\n")
- scriva i byte ricevuti in risposta sulla standard output

Ho provato con due implementazioni:
LA PRIMA

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

public class client
{
public static void main(String[]args)throws Exception
{  
Socket socket=new Socket("151.97.252.4",80);
System.out.println("Client: Partito");

//creazione stream di input da socket
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//creazione stream di output su socket
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); /* autoflush */

out.println("GET /gp/prova/11.html");

String s="";
char r;
boolean copia=false;

while( ( r=(char)in.read() )!=-1 )
{
if(r=='[')
copia=true;
if(copia)
s+=r;
if(r==']')
break;

}

System.out.println("Stringa da inviare al server:  "+s);
                out.print(s);

String output="";
while((s=in.readLine())!=null) {
output+=s;
}
System.out.println("Risposta server: "+output);

out.close(); 
in.close();   
socket.close();
System.out.println("Socket chiusa");
}
}

Compila tutto ok, parte, mi dice partito e non si ferma mai, va in loop infinito, PERCHE'?

LA SECONDA INVECE
Code:
import java.net.*;
import java.io.*;

public class client {

public static void main (String args[]) throws Exception{

Socket socket = new Socket("151.97.252.4", 80);
System.out.println("Client: Partito");

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); /* autoflush */

out.println("GET /gp/prova/11.html");

String x="", buffer = "", s = "";

// Ricevo dati dal server e individuo la prima parentesi quadra aperta
while ((x = in.readLine()) != null && !x.contains("["));
buffer += x;

// Ricevo dati dal server e individuo la prima parentesi quadra chiusa, supponendo che possa cadere su una "linea" successiva
while(!x.contains("]") && (x = in.readLine()) != null);
buffer += x;

// Creazione stringa s
s = buffer.substring(1+buffer.indexOf("["),buffer.indexOf("]")); // estraggo la stringa contenuta tra parentesi [ ]
System.out.println("Il contenuto della stringa racchiusa tra parentesi quadre e:\n" + s);

// -->
socket.close();
socket = new Socket("151.97.252.4", 80);

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
// <--

out.println(s);

// Ricevo e stampo dati dopo l'invio della stringa s
while ((x = in.readLine())!= null)
System.out.println("\nLa seconda risposta del server:\n" + x);

out.close(); 
in.close();   
socket.close();
System.out.println("Socket chiusa");
}
}

Compila tutto ok, e mi lancia l'eccezione..

QUALCUNO potrebbe postare una soluzione corretta e funzionante di questo esercizio sopra citato?
Ragazzi il Laboratorio è imminente, collaboriamo tutti assieme e ce la faremo.
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.475


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 28-04-2011, 23:32:46 »

Compila tutto ok, parte, mi dice partito e non si ferma mai, va in loop infinito, PERCHE'?
Mi dispiace che non sei in grado da te di rispondere a questa semplice domanda (perché?), ma per rispondere a questa domanda sono sufficienti le nozioni che puoi apprendere (ad esempio, ma non solo) a Programmazione1 : non è un discorso di "propedeuticità burocratica", è proprio una delle competenze fondamentali che si devono apprendere a programmazione  , e si chiama "saper fare debug"  pc.

Prima ancora di stabilire "perché" il tuo programma va in loop, sarebbe opportuno circoscrivere il punto di codice (ciclo evidentemente) da cui non si esce mai .

Mi è bastato inserire questa riga di codice dentro al primo ciclo while del primo programma client per capire dove sta il problema:
Code:
    System.out.println ("letto carattere r con codice (unicode) in esadecimale = " + Integer.toString (r, 16) + ".");
Fallo anche tu e (spero) capirai dove sta l'errore.

Poi scoprirai che, in realtà, c'è un altro problema, che, però, non dipende da te e che non potrai mai risolvere e che non farà produrre l'output previsto ma che, una volta riconosciuto (sì, anche solo riconosciuto) per conto tuo, ti farà sentire un bravo analista di sistemi  .

Oltre a diventare un bravo analista e a sentirti fiero di te, capirai anche perché si verifica questa situazione nel secondo codice client, e se sarai attento, scoprirai che c'è un errore tra le righe 19 e 24 (errore nella tua logica, intendo, non di compilazione, perciò non rilevabile dal compilatore  ) e riguarda il motivo per cui il flusso di controllo è potuto giungere alla riga 23 (dove c'è il secondo while, cioè) , motivo evidentemente di cui non hai tenuto troppo conto.
In ogni caso, il compilatore ti ha risposto molto bene (suppongo), proprio come ha risposto a me:
Code:
Client: Partito
Exception in thread "main" java.lang.NullPointerException
        at client.main(client.java:23)
dicendoti esattamente "quale" eccezione è stata sollevata e in quale riga! Più di così, cosa vuoi?
(un Lucano direbbe qualcuno  beer)

Buona risoluzione, sono sicuro che ce la farai  .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #2 on: 28-04-2011, 23:42:00 »

non ho fatto in tempo a risponderti! l'ho visto l'ho corretto e poi mentre andavo per scrivere già qualcuno mi avevo preceduto.

ps ti do un consiglio, prova a stabilire la socket in localo con dei file fatti ad hoc se no non saprai mai se riesci a prendere ciò che c'è tra le parentesi quadre,inviarlo al server ed avere ancora una risposta da quest'ultimo.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #3 on: 29-04-2011, 10:50:47 »

In entrambi i casi non riesco a risolvere, altrimenti non mettevo questo post.
Ma può essere che il server remoto non risponde e non legge niente quindi dandomi questi errori?
E in tal caso come si fa in locale, almeno per vedere se l'esercizio è stato svolto correttamente così passo ad un'altra tipologia.
Tra le due implementazioni quale è preferibile??
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #4 on: 29-04-2011, 11:17:31 »

beh intanto concentrati sulla prima parte. Cioè riuscire a comunicare tramite socket (non importa con chi e per fare cosa).
Nel primo codice:
controlla perché ti finisce in loop. "r" è sempre diverso da -1 quindi non esce mai, è chiaro che qualcosa non va nell'estrazione dei caratteri. Ti posso dire come l'ho fatto io ma non è legge esistono altri modi sicuramente anche migliori.
Code:
while(true )
                {
                    tmp=in.readLine();
                    if(tmp==null) break;
                    //System.out.println(tmp);
                    for(i=0;i<tmp.length();i++)
                    {
                        r=tmp.charAt(i);
                        System.out.println(""+r);
                            if(r==']')
break;
                            if(copia)
                            s+=r;
                            if(r=='[')
copia=true;
                           
                    }
                    if(copia) break;
                }

Questa è il primo while. Come puoi notare un pò diverso.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #5 on: 29-04-2011, 12:05:57 »

Ho modificato != -1 con == -1
while( ( r=(char)in.read() )==-1 )
Così mi da quest'output, è giusto adesso? Cioè deve risultare così?

Client: Partito
Stringa da inviare al server: 
Risposta server: crivere in C o Java un programma che:<ol><li>apra una connessione verso l'IP 192.168.0.34, port 80</li><li>invii la stringa <tt>"GET /gp/prova/11.aux\n"</tt></li><li>nello stream di byte ricevuti individui la prima parentesi quadra aperta</li><li>memorizzi tutti i successivi byte fino alla prima parentesi quadra chiusa, che il server invier&agrave, in una variabile stringa denominata "s" </li><li>invii, sulla connessione gi&agrave aperta, la stringa s(attenzione: dovrebbe terminare per <tt>"\n"</tt>)</li><li>scriva i byte ricevuti in risposta sulla standard output</li></ol>
Socket chiusa
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #6 on: 29-04-2011, 12:28:09 »

e no! così non entri proprio nel while. Togli solo il primo carattere "s" e non entri nel corpo del while, il BufferedReader ti rimane così pieno e lo svuoti (leggi) al secondo while. Non è questo il risultato. Ne la soluzione.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #7 on: 29-04-2011, 12:56:31 »

Ho provato ad inserire il tuo while nella mia implementazione e mi da questo output:

Code:
Client: Partito
S
c
r
i
v
e
r
e
 
i
n
 
C
 
o
 
J
a
v
a
 
u
n
 
p
r
o
g
r
a
m
m
a
 
c
h
e
:
<
o
l
>
<
l
i
>
a
p
r
a
 
u
n
a
 
c
o
n
n
e
s
s
i
o
n
e
 
v
e
r
s
o
 
l
'
I
P
 
1
9
2
.
1
6
8
.
0
.
3
4
,
 
p
o
r
t
 
8
0
<
/
l
i
>
<
l
i
>
i
n
v
i
i
 
l
a
 
s
t
r
i
n
g
a
 
<
t
t
>
"
G
E
T
 
/
g
p
/
p
r
o
v
a
/
1
1
.
a
u
x
\
n
"
<
/
t
t
>
<
/
l
i
>
<
l
i
>
n
e
l
l
o
 
s
t
r
e
a
m
 
d
i
 
b
y
t
e
 
r
i
c
e
v
u
t
i
 
i
n
d
i
v
i
d
u
i
 
l
a
 
p
r
i
m
a
 
p
a
r
e
n
t
e
s
i
 
q
u
a
d
r
a
 
a
p
e
r
t
a
<
/
l
i
>
<
l
i
>
m
e
m
o
r
i
z
z
i
 
t
u
t
t
i
 
i
 
s
u
c
c
e
s
s
i
v
i
 
b
y
t
e
 
f
i
n
o
 
a
l
l
a
 
p
r
i
m
a
 
p
a
r
e
n
t
e
s
i
 
q
u
a
d
r
a
 
c
h
i
u
s
a
,
 
c
h
e
 
i
l
 
s
e
r
v
e
r
 
i
n
v
i
e
r
&
a
g
r
a
v
e
,
 
i
n
 
u
n
a
 
v
a
r
i
a
b
i
l
e
 
s
t
r
i
n
g
a
 
d
e
n
o
m
i
n
a
t
a
 
"
s
"
 
<
/
l
i
>
<
l
i
>
i
n
v
i
i
,
 
s
u
l
l
a
 
c
o
n
n
e
s
s
i
o
n
e
 
g
i
&
a
g
r
a
v
e
 
a
p
e
r
t
a
,
 
l
a
 
s
t
r
i
n
g
a
 
s
(
a
t
t
e
n
z
i
o
n
e
:
 
d
o
v
r
e
b
b
e
 
t
e
r
m
i
n
a
r
e
 
p
e
r
 
<
t
t
>
"
\
n
"
<
/
t
t
>
)
<
/
l
i
>
<
l
i
>
s
c
r
i
v
a
 
i
 
b
y
t
e
 
r
i
c
e
v
u
t
i
 
i
n
 
r
i
s
p
o
s
t
a
 
s
u
l
l
a
 
s
t
a
n
d
a
r
d
 
o
u
t
p
u
t
<
/
l
i
>
<
/
o
l
>
Stringa da inviare al server: 
Risposta server:
Socket chiusa
>Exit code: 0

Io non so esattamente cosa deve dare l'output di questo esercizio.
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #8 on: 29-04-2011, 13:18:00 »

esattamente. Ti legge carattere per carattere, non trovando mai le parentesi quadre, nel secondo output al server non manda niente quindi non hai risposta. Fin qui è giusto, per questo ti dico creati un file ad hoc con delle parentesi quadre e qualcosa all'interno.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #9 on: 29-04-2011, 13:41:54 »

Ok grazie ci provo!!
Senti hai qualche altro esercizio svolto di un'altra tipologia che potrebbe capitare all'esame?
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #10 on: 29-04-2011, 13:47:13 »

gli RMI non riesco a risolverli. Incappo in un problema.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #11 on: 29-04-2011, 13:57:49 »

e senti invece questo che è la stessa tipologia hai qualche soluzione?

Scrivere in C o Java un programma che:

apra una connessione verso l'IP 192.168.0.33, port 80
invii la stringa "GET /gp/prova/04.aux\n"
dallo stream di byte ricevuti memorizzi quelli dal 397.568 al 397.613
scriva questi byte sulla standard output

Come fai a memorizzare quelli dal 397.568 al 397.613
Logged
Grillo
Apprendista Forumista
**
Offline Offline

Posts: 220


« Reply #12 on: 29-04-2011, 21:03:15 »

Come faccio a creare qualcosa in locale per testare i miei esercizi?
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #13 on: 29-04-2011, 22:32:29 »

boh una soluzione che mi viene così in mente è sommare la lunghezza di ogni readLine.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #14 on: 29-04-2011, 22:34:39 »

Come faccio a creare qualcosa in locale per testare i miei esercizi?
installi wamp e in www crei il file che devi leggere(salvi in html), l'indirizzo per accedervi sarà quello di localhost 127.0.0.1 il get il nome del tuo file .html.
Logged

Un "buon informatico" trova una soluzione ad ogni tipo di problema. Un "ottimo informatico" trova la soluzione più efficiente ad ogni tipo di problema! Non stancatevi di migliorare la vostra soluzione!
Pages: [1] 2   Go Up
Print
Jump to: