Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [JAVA] Problema di comunicazione Client-Server

    Buongiorno, spiego in poche parole cosa sto facendo: un progetto server-client multi thread che simula il gioco delle 3 carte ovvero indovina dove è l'asso e scommetti

    ora il problema: il lato server non legge una stringa che gli invio da client ovvero quella di scelta dell'operazione da fare; tutto il codice prima viene eseguito ho verificato con delle semplici stampe.

    posto di seguito il codice relativo al pezzo non funzionante
    codice:
    server 
    try /*prova a catturare errore nella lettura dall'input del client*/
    		{
    			inFromClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			s=inFromClient.readLine();
    			System.out.println("s letta e risp convertita");
    			risp=Integer.parseInt(s);
    
    		}
    		catch (IOException e)
    		{
    			System.out.println("Error " + e);
    		}
    		catch (NumberFormatException e2)
    		{
    			System.out.println("Error " + e2);
    		}
    
    
    client 
    /*stampa del menù effettuata su lato client così da rendere più veloce il processo*/
    		System.out.println("[1] Effettua Login ");
    		System.out.println("[2] Effettua Registrazione ");
    		System.out.println("[3] Gioca ");
    		System.out.println("[0] Esci ");
    		try /*provo a catturare errori nella creazione di flussi di entrata e di uscita*/
    		{
    			fromStdIn=new BufferedReader(new InputStreamReader(System.in));
    			outToServer=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
    			inFromServer=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    
    			System.out.println("Scegli cosa vuoi fare");
    			outToServer.write(s=fromStdIn.readLine());
    			System.out.println("s inviata");
    			risp=Integer.parseInt(s);
    		}
    		catch (IOException e)
    		{
    			System.out.println(" Error: " + e);
    		}
    spero possiate aiutarmi con questo, altrimenti se servono altre spiegazioni chiedete pure!

  2. #2
    Tu nel server fai
    codice:
    s = inFromClient.readLine();
    quindi si aspetta di leggere una linea di testo terminata da una line feed/carriage return oppure da un carriage return seguito da una line feed.

    Allora nel client devi assicurarti che vengano inviate delle righe terminate in quel modo
    codice:
    s = fromStdIn.readLine() + "\n";
    outToServer.write( s );

  3. #3
    e ma quando invio la stringa da client, che viene letta direttamente dallo StandardInput non termina sempre con un \n??

  4. #4
    Originariamente inviato da Nitro_Insane
    e ma quando invio la stringa da client, che viene letta direttamente dallo StandardInput non termina sempre con un \n??
    No.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Problema di comunicazione Client-Server

    Originariamente inviato da Nitro_Insane
    codice:
    client 
    			outToServer.write(s=fromStdIn.readLine());
    readLine() restituisce la stringa senza alcun newline! Quindi non solo devi preoccuparti tu di inviare la stringa accodando un newline dopo ma devi anche valutare le questioni di buffering. Infatti usi BufferedWriter e solo fare una write non vuol dire necessariamente che davvero viene scritto sul OutputStream sottostante!

    P.S. E fare una assegnazione nel passaggio dell'argomento del metodo ... è perlomeno inusuale, io non lo farei.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    anbin aspetta aspetta non confondermi ancora più le idee io pensavo di stare facendo bene in quel modo, quale sarebbe quindi il modo giusto da fare?? Nessuno me lo ha mai spiegato..

    e si è inusuale un assegnazione come parametro, era solo una prova che ho dimenticato di sistemare ho sempre usato il C, col Java trovo qualche difficoltà con tutte queste migliaia di classi esistenti

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Nitro_Insane
    anbin aspetta aspetta non confondermi ancora più le idee io pensavo di stare facendo bene in quel modo, quale sarebbe quindi il modo giusto da fare?? Nessuno me lo ha mai spiegato..
    I punti sono 2:
    1) dall'altra parte (il readLine nel server) si aspetta una "riga", intesa come un testo con in coda un "newline" (fortunatamente readLine è di "bocca buona", accetta qualunque newline, CR o LF oppure CR+LF). Quindi è chiaro che devi inviare tu un newline. Leggendo dallo standard-input con readLine ha la riga letta escluso il newline.
    Quindi dovresti fare es.
    outToServer.write(stringaLettaDaStdIn);
    outToServer.write("\n");

    o eventualmente concatenando le due stringhe (anche se forse è meglio fare 2 write separate).

    2) Il fatto che usi BufferedWriter non vuol dire che una write fa davvero scrivere sul output stream sottostante! Per essere certi dovresti fare un flush().

    O in alternativa per combinare newline+flush, potresti usare un PrintWriter (nota: creato con auto-flush a true) e il suo println(). Così con quest'ultimo non solo scrivi un newline ma fai anche un flush. L'unico "difetto" è che il println usa il newline della piattaforma su cui gira ... ma dal momento che poi usi readLine, qualunque newline è accettato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    penso di seguirti quindi provo.
    Ti ringrazio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.