PDA

View Full Version : [JAVA] Inviare Stringhe tramite socket


EnZiMa
11-09-2007, 16:24
Salve, ho un problemino nell' invio di stringhe dal server al client

server :
public void run() {

if (socket.isConnected()) {
System.out.print("\n *** Connessione del Client : "
+ format(socket) + " ***");
}
try {
BufferedReader fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter toClient = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); //autoflush

while (true) {
//Ascolto i messaggi del client
String userInput = fromClient.readLine();
if (!userInput.equals(null)) {

//stampo i messaggi del client
System.out.print("\nIl Client " + format(socket)+ " ha scritto : " + userInput);

//interpreto i messaggi del client
int valore = elaboraInput(userInput);
switch (valore) {
case 0:
toClient.println("Comando inserito non valido! Digitare help per la lista dei comandi");
break;
case 2:
toClient.println("Comando ancora non disponibile");
break;
case 11:
toClient.println("Comando 1\n"+
"comando 2\n"+
"comando 3");
break;
case 12:
toClient.println("Disconnessione dal Server...");
break;
}

}

if (userInput.equalsIgnoreCase("quit")){
toClient.close();
fromClient.close();
System.out.print("\n *** Disconnessione del Client : "
+ format(socket) + " ***");
socket.close();
break;
}
}
} catch (IOException e) {
System.out.print("\nErrore nella connessione con il Client "
+ format(socket) + " : " + e.getMessage());
}
}


Client :

private void connetti(String ip, int porta) {

try {

Socket clientSocket = new Socket(ip, porta);
// clientSocket.setSoTimeout(5000);
System.out.println("In connessione con il Server...\n");
// Thread.sleep(10000);

PrintWriter toServer = new PrintWriter(new OutputStreamWriter(
clientSocket.getOutputStream()), true); // autoflush
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
BufferedReader console = new BufferedReader(new InputStreamReader(
System.in));

System.out.println("Connessione stabilita con il Server "
+ format(clientSocket) + "\n");

while (true) {
System.out.print("Client > ");
String userInput = console.readLine();

// se viene premuto invio non fare nulla
if (!userInput.equalsIgnoreCase("")) {

// mando al server
toServer.println(userInput);

// se scrivo quit, mando al server il messaggio di uscita ed
// esco dal ciclo
if (userInput.equalsIgnoreCase("quit")) {
toServer.println(userInput);
break;
}

// leggo la stringa del server e la stampo
String linea = fromServer.readLine();
System.out.println(linea);
}
}

console.close();
fromServer.close();
toServer.close();
clientSocket.close();
System.out.println("Connessione terminata con il Server "
+ format(clientSocket));

} catch (UnknownHostException e) {
System.out.println("Impossibile connettersi al Server " + ip + ":"
+ porta + " Host sconosciuto!");
} catch (IOException e) {
System.out.println("Errore nella connessione con il Server " + ip
+ ":" + porta);
}
}


Quando il client digita help per la lista dei comandi, il server invia una stringa con l'elenco dei comandi. Per ogni comando c'è /n che torna a capo, quindi è come se fossero 3 Stringhe. Il problema è che il client tramite il BufferedReader con il metodo readLine() mi stampa una stringa alla volta! :mc:
Come faccio a far stampare tutta la lista dei comandi in un colpo solo? :confused:

help me! :cry:

Grazie :)

PGI-Bis
11-09-2007, 16:42
Prova a usare Scanner (java.util) al posto di BufferedReader. Scanner ha un metodo hasNextLine() che ti permette di dire:

//leggo la risposta del server
while(scanner.hasNextLine()) { System.out.println(scanner.nextLine()); }

EnZiMa
11-09-2007, 18:08
Prova a usare Scanner (java.util) al posto di BufferedReader. Scanner ha un metodo hasNextLine() che ti permette di dire:

//leggo la risposta del server
while(scanner.hasNextLine()) { System.out.println(scanner.nextLine()); }

Ho provato...ma non funziona....ho risolto cosi!

// leggo la stringa del server e la stampo
String linea = fromServer.readLine();
//uso StringTokenizer per spezzare le stringhe
StringTokenizer tokenziner = new StringTokenizer(linea,":");
while(tokenziner.hasMoreTokens()) {
System.out.println(tokenziner.nextToken());
}


byez ;) :D