Pages: [1]   Go Down
Print
Author Topic: help su esercizio java  (Read 2373 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
hicks80
Matricola
*
Offline Offline

Gender: Male
Posts: 32



« on: 21-01-2011, 09:35:26 »

Qualcuno sarebbe cosi gentile da implementare questo esercizio o di spiegarmi a grandi linee come fare? pray
Scrivere in C o Java un programma che:
- apra una connessione verso l'IP 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
- scriva i byte ricevuti in risposta sulla standard output

grazie yoh
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #1 on: 26-01-2011, 17:38:49 »

Questo è il codice che ho scritto io. Ho riscontrato un problema e non sono riuscito a risolvere nè a capire di preciso.
In pratica dopo l'invio della prima stringa, con la dovuta ricezione di dati dal server, non riesco più a ricevere la risposta del server dopo l'invio della stringa s. Non ho capito se il problema è sul printwriter che non invia correttamente la stringa s o ad un problema di bufferizzazione in quanto nella prima ricezione si ricevono notevoli bytes! L'unica soluzione che ho trovato è di chiudere la connessione (e quindi anche gli stream) e riaprirla... (se volete provare, sul codice commentate quelle righe racchiuse tra le freccie commentate)
Magari proverò a implementarlo con le socket Datagram o in C.

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

public class ProvaEsame {

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

Socket client = new Socket("151.97.252.4", 80);

BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter pw = new PrintWriter(client.getOutputStream(), true); /* autoflush */

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

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

// Ricevo dati dal server e individuo la prima parentesi quadra aperta
while ((x = br.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 = br.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 è:\n" + s);

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

br = new BufferedReader(new InputStreamReader(client.getInputStream()));
pw = new PrintWriter(client.getOutputStream(),true);
// <--

pw.println(s);

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

Diventa ciò che sei nato per essere
hicks80
Matricola
*
Offline Offline

Gender: Male
Posts: 32



« Reply #2 on: 28-01-2011, 09:48:27 »

Grazie per avermi dato un idea di come si sviluppasse...ormai ci avevo perso le speranze che qualcuno si facesse avanti yoh
Dunque il codice oggi non ho il tempo di provarlo, spero di farlo quanto prima...grazie infinite!
« Last Edit: 28-01-2011, 09:53:40 by hicks80 » Logged
france_88
Apprendista Forumista
**
Offline Offline

Posts: 119



« Reply #3 on: 30-01-2011, 02:21:45 »

questa è la mia implementazione:

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
InputStreamReader isr=new InputStreamReader(socket.getInputStream());
BufferedReader in=new BufferedReader(isr);

//creazione stream di output su socket
OutputStreamWriter osw =new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bw=new BufferedWriter(osw);
PrintWriter out=new PrintWriter(bw,true);

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

String s="";
char r;
boolean copia=false;
while( ( r=(char)isr.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");
}
}

bisogna aspettare qualche secondo per ricevere le risposte dal server, perche i byte inviati da quest'ultimo
sono tanti
Logged
ale
Matricola
*
Offline Offline

Posts: 84


« Reply #4 on: 30-01-2011, 10:58:39 »

Negli ultimi appelli per il laboratorio è stato chiesto sempre questo tipo di esercizi?? grazie a chiunque risponda!! 
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #5 on: 30-01-2011, 11:27:35 »

@france_88
vedi che il tuo programma non funziona!
Tu ricevi i bytes dal server ma conservi la stringa:
[GET /gp/prova/11aux.html]
che poi rinvii, ma ovviamente non ricevi niente (se non vado errato dovresti ricevere un errore!). Peraltro come accennato prima da me, non ricevi neanche l'errore, ma lo stesso flusso di bytes ricevuto al primo invio per un problema che non ho potuto capire...

Devi inviare la stringa di sopra escludendo le parentesi quadre... puoi convincerti tu stesso cliccando a questo indirizzo:

http://151.97.252.4/gp/prova/11aux.html


 

Logged

Diventa ciò che sei nato per essere
hicks80
Matricola
*
Offline Offline

Gender: Male
Posts: 32



« Reply #6 on: 07-02-2011, 19:30:49 »

Nessuno ha provato a risolvere questo problema? Ho pensato: magari bisogna "resettare" lo stream di input, ma come si fa in java? In c credo si usi fflush se non sbaglio...qualche idea per java? cool
Logged
Giuseppe Pappalardo
Moderator
Apprendista Forumista
*****
Offline Offline

Posts: 398


« Reply #7 on: 08-02-2011, 00:31:48 »

In realtà tra il primo e il secondo GET occorre chiudere e riaprire la
connessione al server.
Logged
cock86
Forumista Eroico
*****
Offline Offline

Posts: 2.014


OM


« Reply #8 on: 02-05-2011, 11:23:45 »

Quote
che poi rinvii, ma ovviamente non ricevi niente (se non vado errato dovresti ricevere un errore!). Peraltro come accennato prima da me, non ricevi neanche l'errore, ma lo stesso flusso di bytes ricevuto al primo invio per un problema che non ho potuto capire...
quando trovi la "]" esci e nel BufferReader rimane il contenuto dopo lo stesso simbolo, che viene svuotato solo alla prossima readLine() e quindi non avremmo quello che vorremmo.
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]   Go Up
Print
Jump to: