Premetto che Java non è un lang che amo e quindi non lo uso mai. Pertanto praticamente non lo conosco. E anche tutti i codici che scrivo non sono nemmeno testati.
1) Non vedo il senso del
2) Per leggere da tastiera puoi anche utilizzare la classe
Inoltre, come ho scritto anche nei commenti, prima si stampa il messaggio che dice cosa si vuole prendere in input ("Inserisci hostname"), dopo si prende l'input. Mentre tu fai il contrario (prima prendi l'input e dopo stampi il messaggio di richiesta di input - non ha molto senso). Infatti, eseguendolo, dovrebbe risultarti l'output ritardato rispetto all'input.
Inoltre istanzi
La stessa cosa la fai dentro il ciclo for per la stringa da inviare - dovrebbe essere invece qualcosa del genere:
3) All'inizio chiedi inutilmente in input una "stringa da convertire". La traccia non lo richiede. Di fatto poi questa stringa da convertire non la usi mai nel resto del codice.
4) Stampi a schermo
5) il ciclo for aumenta due volte la variabile
I passi in ordine che dovresti fare dovrebbero essere:
1) Non vedo il senso del
while(true)
: la traccia dice che devi mandare 10 stringhe, quindi riceverne una, e poi chiudere la connessione. Ma il codice che hai scritto non chiude mai la connessione (resta sempre dentro il ciclo while) e continua ripetutamente a mandare 10 stringhe e riceverne una.2) Per leggere da tastiera puoi anche utilizzare la classe
BufferedReader
, ma tipicamente si utilizza la classe java.util.Scanner
(va aggiunto l'import
) in questo modo:
Java:
Scanner input = new Scanner(System.in);
System.out.print("Inserisci hostname: "); /* prima stampi il messaggio che chiede cosa inserire ... */
String hostname = input.nextLine(); /* ... dopo prendi l'input */
Inoltre istanzi
input
dopo averla utilizzata (cosa che dovrebbe darti errore): mentre devi fare il contrario - prima le classi si istanziano (come ho fatto con la Scanner
qui sopra) e poi si utilizzano.La stessa cosa la fai dentro il ciclo for per la stringa da inviare - dovrebbe essere invece qualcosa del genere:
Java:
System.out.print("Inserisci la stringa da inviare al server: ");
String inviata = input.nextLine(); /* "inviata" non è proprio un bel nome. Semmai "daInviare" se proprio vuoi utilizzare nomi italiani per le variabili (che generalmente non è una buona idea) */
out.println(inviata);
4) Stampi a schermo
clientSocket
, che è una istanza della classe Socket
che non penso possa essere convertita implicitamente in stringa e stampata.5) il ciclo for aumenta due volte la variabile
i
(ci sono 2 i++
). In questo modo, il ciclo viene eseguito solo 5 volte e non 10 come dovrebbe.I passi in ordine che dovresti fare dovrebbero essere:
Codice:
1) Crei un oggetto della classe Scanner, lo chiami "input".
2) Stampi a schermo il messaggio "Inserisci hostname: ".
3) Leggi una riga (nextLine()) da tastiera (oggetto "input") e salvi il risultato in una variabile stringa che chiami "hostname".
4) Stampi a schermo il messaggio "Inserisci porta: ".
5) Leggi un intero (nextInt()) da tastiera (oggetto "input") e salvi il risultato in una variabile intera che chiami "port".
6) Crei un oggetto della classe Socket, passando "hostname" e "port" come parametri.
7) Crei gli oggetti "isr", "in", "osw", "bw", "out" esattamente come hai fatto nel codice che hai postato.
8) Inizio ciclo for: for(int i = 0; i < 10; i++).
9) Stampi a schermo il messaggio "Inserisci stringa da inviare: ".
10) Leggi una riga da tastiera (oggetto "input") e salvi il risultato in una variabile stringa che chiami "curstr".
11) Invii la stringa "curstr" sul socket (oggetto "out").
12) Fine ciclo for (viene ripetuto 10 volte).
13) Leggi una riga dal socket (oggetto "in") e la salvi in una variabile stringa che chiami "received".
14) Stampi a schermo la stringa salvata in "received".
15) Chiudi il socket terminando la connessione.