Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139

    Problema gestione output applicazione client/server

    Ciao a tutti,

    sto realizzando un'applicazione client/server in cui il server manda dei messaggi al client, il quale deve rispondere immettendo dei dati in input.
    Il problema sorge quando devo stampare i messaggi con il server, questo è il codice del mio server:
    codice:
    package server1;
    import java.io.*;
    import java.net.*;
    import java.util.Scanner;
    
    public class Server1 
    {
        public Server1(int port)
        {
            this.port=port;
        }
        
        public void startServer() throws IOException
        {
            //PASSO 1:APRO PORTA TCP
            servSock=new ServerSocket(port);
            System.out.println("Server pronto sulla porta: "+port);
            
            //PASSO 2:ATTESA DELLA CONNESSIONE
            Socket sock=servSock.accept();
            System.out.println("Connessione con il client stabilita");
            
            //PASSO 3:APRO STREAM PER FARE I/O
            Scanner in=new Scanner(sock.getInputStream());
            PrintWriter out=new PrintWriter(sock.getOutputStream());
            
            //PASSO 4:FACCIO LA LETTURA E SCRITTURA NELLA CONNESSIONE
            out.println("Vuoi continuare? (Y/N)");
            out.flush();
            String line=in.nextLine();
           if(line.equals("Y"))
           {
                while(true)
                {  
                    if(line.equals("N"))
                    {
                        break;
                    }else if(line.equals("Y")){
                        out.println("Immetti q");
                        out.flush();
                        String q=in.next();
                        out.println("q="+q);
                        out.flush();
                    }
                    out.println("Vuoi continuare? (Y/N)");
                    out.flush();
                    line=in.nextLine();
                }
           }
           
            //PASSO 5:CHIUDO STREAM E SOCKET
            System.out.println("Chiusura della connessione");
            in.close();
            out.close();
            sock.close();
            servSock.close();
            System.out.println("Connessione chiusa");
        }
        
        private int port;
        private ServerSocket servSock;
    }
    Adesso quando faccio out.println("Vuoi continuare? (Y/N)"); mi stampa il messaggio su una riga sola, in modo corretto.
    Entrato nell'if, quindi nel ciclo while, le restanti out.println(); , mi vengono spezzate su più righe, ovvero esso stampa: Immetti, poi premendo invio mi stampa una riga vuota, poi premendo nuovamente invio mi stampa q, invece dovrebbe stampare come dato dalla out, direttamente "Immetti q" su un'unica riga.

    Non riesco a capire dove possa essere l'errore.

    Grazie a tutti per l'aiuto!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da EziT90 Visualizza il messaggio
    Entrato nell'if, quindi nel ciclo while, le restanti out.println(); , mi vengono spezzate su più righe, ovvero esso stampa: Immetti, poi premendo invio mi stampa una riga vuota, poi premendo nuovamente invio mi stampa q, invece dovrebbe stampare come dato dalla out, direttamente "Immetti q" su un'unica riga.
    Dato che quel output va al client .... dipende come il client legge questo suo "input". Quindi mostra il client.

    P.S.
    Attenzione in generale a 2 cose:
    - all'uso "mixato" di nextLine() di Scanner con gli altri next() / nextXYZ()
    - alle questioni sui charset; i socket trattano byte, se invii caratteri dovresti stabilire l'uso di un charset ben preciso, tipicamente UTF-8. Con client e server sulla stessa macchina ovviamente non è un problema evidente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Buon pomeriggio Andbin,

    posto il codice del mio client:

    codice:
    package client1;
    import java.io.*;
    import java.net.*;
    import java.util.Scanner;
    import java.util.NoSuchElementException;
    
    
    
    public class Client1 
    {
        public Client1(String IP, int port)
        {
            this.IP=IP;
            this.port=port;
        }
        
        public void startClient() throws IOException
        {
            Socket sock=new Socket(IP,port);
            System.out.println("Connessione stabilita");
            
            Scanner sockIN=new Scanner(sock.getInputStream());
            PrintWriter sockOUT=new PrintWriter(sock.getOutputStream());
            Scanner stdin=new Scanner(System.in);
            
            String a=sockIN.nextLine();
            System.out.println(a);
            try{
                while(true)
                {
                    String input=stdin.nextLine();
                    sockOUT.println(input);
                    sockOUT.flush();
                    String sockline=sockIN.next();
                    System.out.println(sockline);
                }
            }catch(NoSuchElementException e)
            {
                System.out.println("Connessione chiusa");
            }finally
            {
                stdin.close();
                sockIN.close();
                sockOUT.close();
                sock.close();
            }
        }
        
        private String IP;
        private int port;
    }
    il programma lo faccio girare in locale, questo è il motivo per cui non ho usato il charset, se ritieni sia opportuno farò questa modifica, fin ora ho pensato fosse il server il problema proprio dal fatto che il primo output veniva effettuato correttamente ed i restanti no.
    P.s non pensavo ci fossero problemi con l'uso dei vari nextQualcosa(), cosa potrebbe portarmi problemi??

    Grazie per l'aiuto ;-)
    Ultima modifica di LeleFT; 07-12-2016 a 18:58 Motivo: Corretto tag chiusura CODE

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da EziT90 Visualizza il messaggio
    codice:
            Scanner sockIN=new Scanner(sock.getInputStream());
            
            String a=sockIN.nextLine();
    
            try{
                while(true)
                {
                    // ....
    
                    String sockline=sockIN.next();
                }
     .......
    Dalle sole parti che ho evidenziato, a parte un primo nextLine(), nel resto del while fai un next(). Questo estrae 1 token. I token in Scanner per default sono separati da whitespace. Se il server manda "Immetti q" questi .... sono DUE token.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Ciao Andbin,

    grazie per la risposta, non sapevo che la classe Scanner vedesse lo spazio come due token, questo mi ha portato ad usare il next() anzichè nextLine() .

    Adesso però ho ancora due problemi, sul mio server.
    A differenza di quanto postato nel primo messaggio, ho effettuato questa modifica al server:

    [CODE]
    //PASSO 4:FACCIO LA LETTURA E SCRITTURA NELLA CONNESSIONE
    while(true)
    {
    out.println("Vuoi continuare? (Y/N)");
    out.flush();
    String line=in.nextLine();
    if(line.equals("N"))
    {
    break;
    }else if(line.equals("Y")){
    out.println("Immetti q");
    out.flush();
    String q=in.nextLine();
    int qq=Integer.parseInt(q);
    out.println("q="+q);
    out.flush();
    out.println("Immetti p");
    out.flush();
    String p=in.nextLine();
    int pp=Integer.parseInt(p);
    out.println("p="+p);
    out.flush();
    int n=pp*qq;
    out.println("n="+n);
    out.flush();
    }
    }
    [\CODE]

    I miei problemi ora sono dati dal fatto che, dopo aver richiesto e stampato q, per avere stampata la richiesta di p, devo dare un invio, poi dopo aver dato in input p, non mi da in risposta p='il mio numero in input' , e non ho in output neanche il numero n ottenuto come p*q , ma chiude direttamente la connessione.
    Cosa potrebbe essere, non ne ho idea mi sto .

    Grazie ancora per la pazienza nell'aiutarmi.
    Ultima modifica di EziT90; 08-12-2016 a 18:53

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.