Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8

    (Java Chat Client/Server) Fallimento invio del secondo messaggio

    Salve a tutti!
    Sto realizzando un'applicazione Client Server in Java (come da titolo), in cui il server resta in attesa, su una determinata porta, della richiesta di connessione da parte di un client. Quest'ultimo, una volta specificati in input indirizzo IP e pornumber del server a cui connettersi, attende il primo messaggio di conferma dal server. Il server quindi si predispone all'invio di un messaggio. Il messaggio viene scritto nella textarea e inviato tramite pressione di un jbutton. Il client riceve il messaggio e lo visualizza sulla sua textarea.
    Fin qui, nulla di complicato. Il messaggio viene inviato e ricevuto correttamente, sia in locale che in rete.

    PROBLEMA: una volta inviato il primo messaggio, se ne scrivo un altro nella textarea, e premo nuovamente il tasto di invio, il messaggio non viene inviato. Ho predisposto una try/catch in cui in caso di errore visualizzo un messaggio che dice che la connessione è chiusa, per mettere una toppa temporanea. Il problema però lo devo risolvere!
    Quando provo ad inviare, da lato server ho questo errore:

    java.io.IOException: Stream closed
    at java.io.BufferedWriter.ensureOpen(Unknown Source)
    at java.io.BufferedWriter.write(Unknown Source)
    at java.io.Writer.write(Unknown Source)
    at Server.run(Server.java:136)
    at java.lang.Thread.run(Unknown Source)


    Il problema, credo di aver capito, sta nel fatto che lo stream è chiuso, quindi il server chiude lo stream e rende impossibile l'invio di nuovi messaggi.

    Allora, effettivamente io chiudo l'oggetto bw di tipo BufferedWriter, dopo aver inviato il messaggio, poiché ho notato che se non lo faccio, il messaggio non viene ricevuto dal client (pertanto, vorrei anche sapere se è previsto chiudere il BufferedWriter).
    Chiudendolo (bw.close()), permetto l'invio del primo messaggio, però poi non riesco più a riaprirlo!

    In sintesi: come posso inviare più messaggi al client?
    Devo usare lo stesso oggett BufferedWriter o devo usarne un altro?


    Ps. non ho postato il codice perché ci sono più classi, di cui alcune si occupano della modifcia del messaggio, che non è fulcro del problema. Se necessario posso allegarlo.

    Grazie a tutti dell'attenzione, aspetto risposte.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Ma invece di chiudere lo stream hai provato semplicemente a fare flush()?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8
    Sì, ho provato sia a fare flush() al posto di chiudere bw, e anche flush() e dopo bw.close(), ma niente.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quello che va fatto è effettivamente un flush(). E funziona, se tutto il resto è scritto correttamente.
    Quindi, posta il codice, che vediamo cosa stai sbagliando.

    Ovviamente la close() va fatta solo quando si intende chiudere la comunicazione ed effettuare, quindi, una disconnessione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8
    Ok, allora posto il codice!

    Classe "Server"

    codice:
    /* SERVER */
    
    import java.net.*;
    import java.io.*;
    
    import javax.swing.JOptionPane;
    
    public class Server implements Runnable
    {
     private int port;
     private ServerSocket server;
     private static Socket socket;
     private static BufferedWriter bw;
     private String MessageToSend;
     private Thread sendmess;
     private boolean isConnected = false;
     private String code_key = "modestopanetti";
    
    ////////////////////////////////////////////////////////////// constructor
     public Server (int p) 
     {
         
      port = p;
      
      if(!createServer()) //crea il server ed segnala eventuale errore
       System.err.println("Errore durante la creazione del Server");
     }
     
     
     
    
    //////////////////////////////////////////////////////////// crea il server
     public boolean createServer()
     {
      try
      {
       server = new ServerSocket(port); //inizializza la serversocket  
      }
      catch (IOException ex) {
       ex.printStackTrace();
       return false;
      }
      System.out.println("Server creato con successo!");
      return true;
     }
     
     
     
    
    ///////////////////////////////////////////////////////////// avvia il server
     public void runServer()
     {
       try
       {
        if (isConnected==false) //se non è connesso, attendi una connessione
        {
        System.out.println("Server in attesa di richieste…");
        socket = server.accept(); //attende fino all'arrivo della richiesta di connessione dal client
        System.out.println("connessione con un client");
        Server_Main.SF.setConnectionStatus(1); //connessione stabilita
        isConnected = true;
       }
        
        System.out.println(isConnected +"... il server è pronto per l'invio di un nuovo messaggio");
       
       }
       catch (IOException ex)
       {
        ex.printStackTrace();
       }   
     }
    
     
     
     
     
     
    ////////////////////////////////////////////////// crea il buffer di scrittura 
    public void createBuffer() {
        OutputStream sout;
        try {
            sout = socket.getOutputStream();
            bw = new BufferedWriter(new OutputStreamWriter(sout)); // crea il buffered reader
            System.out.println("    BUFFER creato");
        } catch (IOException e) {System.out.println("    BUFFER non creato" +socket.isClosed()); }
        
    }
    
    
    
    
    ////////////////////////////////////////////////////////chiude la connessione 
    public void CloseConnection() {
         
         try {
            try {
                bw.flush();
                bw.close(); //chiudi il buffered reader
                
                System.out.println("    BUFFER chiuso\n");
                
            } catch(NullPointerException npe) {npe.printStackTrace();}
        } catch (IOException e) {e.printStackTrace();}
         
         runServer();
     }
    
    
    
    /////////////////////////////////////////////////////////// invia il messaggio
     public void SendMessage() {
         MessageToSend = Server_Main.SF.message_area.getText(); //il messaggi oda inviare è quello scritto nell'area di testo
         
         ////////// CRITTOGRAFIA DEL MESSAGGIO////
         Coder coder = new Coder(MessageToSend, code_key);
         MessageToSend = coder.Codifica();
         Server_Main.SF.code_area.setText(MessageToSend);
         /////////////////////////////////////////
         
         sendmess = new Thread(this);
         sendmess.start();
     }
    
     
     
     
     
     
    ///////////////////////////////////////////////////////////////////////////////
    public void run() {
        
    createBuffer();
                try {
                bw.write(MessageToSend); // scrivi il messaggio sul buffer //
                System.out.println("Il messaggio ["+MessageToSend+"] è stato inviato correttamente!\n");
                
                } catch (IOException e) {
                System.out.println("     > impossibile inviare il messaggio");
                JOptionPane.showMessageDialog(null, "impossibile inviare il messaggio. Connessione scaduta.");
                e.printStackTrace();
                }
            
            CloseConnection(); // Chiude lo stream di output 
            sendmess.stop();
    
        }
    }


    Classe "Server_Main"
    codice:
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    
    public class Server_Main {
    
        public static int port_number = 1984;
        public static ServerFrame SF; //finestra del server
        public static Server SER; //processo server
        
        ///////////////////////////////////////////////////////
        /* restituisce l'ip locale dell'host */
        public static String getIP() {
            
            InetAddress addr;
            String ip =" --- ";
            try {
                addr = InetAddress.getLocalHost();
                ip = addr.getHostAddress();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            return ip;
        }
        
        ///////////////////////////////////////////////////////
        public static void main (String args[]) {
    
            SF = new ServerFrame(); //istanzia l'oggetto finestra del server
            SER = new Server(port_number); //crea il server, assegnando il processo sulla porta passata per parametro
            SER.runServer(); //avvia il server
        }
    
    }

    Classe "Client":
    codice:
    /*client*/
    
    import java.net.*;
    import java.io.*;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class Client implements Runnable
    {
        private static int server_portnumber;
        private static String server_ip;
        private static Thread listen;
        private static Socket socket;
        private InputStream is;
        BufferedReader buffer;
        private String code_key = "modestopanetti";
        
     public Client()
     {
         
         SetIpSocket(); //imposta i valori degli indirizzi di client e server ramite finestre di dialogo
         
      try
      {
       System.out.println("Apertura connessione…");
       
       /**
        */
       /** stabilisce la connessione con il server e resta in attesa */
       Client_Main.CF.setIPPort(server_ip, server_portnumber);
       socket = new Socket (server_ip, server_portnumber);
       Client_Main.CF.SetOnOff(1); //a questo punto la connessione col server è stata stabilita, quindi l'interruttore passa a ON
       Client_Main.CF.Answer("In attesa di rosposta...");
       /**************************************************************/
       
       ListenTo();
      
       
      }
      catch (ConnectException connExc)
      {
       System.err.println("Errore nella connessione ");
       Client_Main.CF.Answer("Errore nella connessione "); // scrive nell'area del messaggio
       
      }
      catch (IOException ex)
      {
       ex.printStackTrace();
      }  
      
     }
     
     public static void SetIpSocket() {
         
        server_ip = JOptionPane.showInputDialog(Client_Main.CF, "Specificare indirizzo IPv4 del server");
        server_portnumber = Integer.parseInt(JOptionPane.showInputDialog(Client_Main.CF, "Specificare numero di porta del server"));
     }
     
     public void ListenTo () {
         
         listen = new Thread(this);
         listen.start();
     }
     
     public void run () {
         String answ;
         
            try {
                   is = socket.getInputStream();
                   buffer = new BufferedReader(new InputStreamReader(is));
                   
            } catch (IOException ioe) { 
                System.out.println("Client.error 1");
                ioe.printStackTrace(); 
                }
                   
                   try {
                    answ = buffer.readLine();
                    System.out.println("Risposta del server: " + answ); // Legge l’input e lo visualizza sullo schermo
                    
                    // DECODIFICA DEL MESSAGGIO ////////////////
                    Decoder decoder = new Decoder(answ, code_key);
                    answ = decoder.Decodifica();
                    ////////////////////////////////////////////
                    
                    
                    Client_Main.CF.Answer(answ);
                    
                    if (answ.equals("bye")) {
                        //buffer.close();
                        
                           socket.close();
                           System.out.println("Chiusura connessione effettuata");
                    } 
                       else {
                           System.out.println("Client in attesa di un nuovo messaggio");
                       }
                } catch (IOException e) {
                    System.out.println("Client.error 2");
                    e.printStackTrace();
                }
                   //////////////////////////////////////////////////////////////
               
     }
    }

    Classe "ClientMain":
    codice:
    public class Client_Main {
    
        public static ClientFrame CF;
        
        
        public static void main (String args []) {
            
            CF = new ClientFrame();
            Client client = new Client();
        }
    }

    Sia per il client che per il server esistono le classi Coder e Decoder, che semplicemente codificano e decodificano il messaggio in partenza e poi in arrivo (il progetto che sto realizzando consiste in una chat crittografata), e poi le classi ServeFrame e ClientFrame. Queste ultime due, tramite una JFrame, gestiscono l'inserimento del messaggio (per il server) e la ricezione (per il client). In ServerFrame c'è un JButton che se premuto chiama il metodo Sendmessage() della classe Server. Sono funzionanti, poiché il primo messaggio viene inviato bene! Per non fare un papiro di codice, non posto queste classi poiché sono di supporto, e personalmente non credo che il problema risieda lì. Nel caso però posso postare anche quelle.

    Grazie dell'aiuto ragazzi

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