Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396

    mandare testo chat da text area

    Ciao, ho questa chat funzionante ma non riesco a mandare i messaggi dalla textArea2 verso il client.
    Se li imposto nel programma li manda, ma dal pannello della applet non funziona.
    Questo è il codice del server che manda il messaggio:

    codice:
    import java.io.*;
    import java.net.*;
    import java.awt.event.*;
    
    
    public class server extends javax.swing.JApplet {
    
       String data="benvenuto";
        /** Initializes the applet cliente */
        public void init() {
            try {
                java.awt.EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        initComponents();
              jButton1.addActionListener(new ser());
    
                    }
                });
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
        }
    
      public class ser implements ActionListener {
          public void actionPerformed(ActionEvent b1) {
    //    public static void main(String args[]) {
         
    
          try {
             
             ServerSocket srvr = new ServerSocket(1234);
             Socket skt = srvr.accept();
             System.out.print("Server has connected!\n");//stampa sul terminale
             jTextArea1.append("Server connesso!\n");
        
             PrintWriter out = new PrintWriter(skt.getOutputStream(), true);//da il messaggio in uscita
             System.out.print("Sending string: " + data + "\n");//terminale
             jTextArea1.append("Mandando la stringa: " + data + "\n");
    
             jTextArea2.addKeyListener(new invio());
             out.print(data);//manda al client
             out.close();
             skt.close();
             srvr.close();
             }
          
          catch(Exception e) {
             System.out.print("Whoops! It didn't work!\n");
             jTextArea1.append("non funziona");
          }
    
       }
    }
    
    
    public class invio extends KeyAdapter {
    public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    System.out.println("invio !");
    jTextArea1.append("Server: " + jTextArea2.getText() + "\n");
    data=jTextArea2.getText();
    jTextArea2.setText("");
      }
     }
    }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            jButton1 = new javax.swing.JButton();
            jTextField2 = new javax.swing.JTextField();
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextArea1 = new javax.swing.JTextArea();
            jLabel2 = new javax.swing.JLabel();
            jScrollPane2 = new javax.swing.JScrollPane();
            jTextArea2 = new javax.swing.JTextArea();
            jLabel1 = new javax.swing.JLabel();
            jTextField1 = new javax.swing.JTextField();
    
            jButton1.setText("Connetti");
    
            jTextArea1.setColumns(20);
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);
    
            jLabel2.setText("porta");
    
            jTextArea2.setColumns(20);
            jTextArea2.setRows(5);
            jScrollPane2.setViewportView(jTextArea2);
    
            jLabel1.setText("IP");
    
            jTextField1.setText("1234");
    
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 400, Short.MAX_VALUE)
                .add(layout.createSequentialGroup()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                            .addContainerGap()
                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                                .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane2)
                                .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE)))
                        .add(layout.createSequentialGroup()
                            .add(48, 48, 48)
                            .add(jTextField2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 80, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(50, 50, 50)
                            .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 84, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                            .add(jButton1))
                        .add(layout.createSequentialGroup()
                            .add(72, 72, 72)
                            .add(jLabel1)
                            .add(115, 115, 115)
                            .add(jLabel2)))
                    .addContainerGap(31, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 300, Short.MAX_VALUE)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 137, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 34, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 23, Short.MAX_VALUE)
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(jLabel1)
                        .add(jLabel2))
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(jTextField2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(jButton1))
                    .addContainerGap())
            );
        }// </editor-fold>                        
    
    
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JScrollPane jScrollPane2;
        private javax.swing.JTextArea jTextArea1;
        private javax.swing.JTextArea jTextArea2;
        private javax.swing.JTextField jTextField1;
        private javax.swing.JTextField jTextField2;
        // End of variables declaration                   
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    prova a cambiare la definizione del metodo
    public void keyPressed(KeyEvent e)
    con
    public void keyTyped(KeyEvent e)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    non è quello il motivo.
    La keyPress funziona bene e mi manda anche sullo schermo i comandi che digito,oltre a cancellare il testo una volta inviato.
    Il problema è che i comandi che mando non arrivano al client.Come se la connessione soket fosse chiusa ed il messaggio si potesse inviare solo inserendolo dentro la funzione try{}

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    ah, ho capito, il problema è il seguente:

    tu chiami jTextArea2.addKeyListener(new invio());

    solo quando è stato cliccato il JButton... in effetti registri il listener dell'evento tastiera solo dopo aver aperto la socket ed appena prima di scrivere al client, in pratica non hai il tempo di fare nulla che il client ha già ricevuto una text area vuota...

    sposta jTextArea2.addKeyListener(new invio()) nella fase di init e vedi che succede.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Si, esatto, è quello il problema.
    Purtroppo però mandando il KeyListner nella finestra di init non cambia niente.
    Infatti così lui imposta che deve restare in ascolto sulla jTextArea2, ma non impedisce al soket di partire,effettuare il suo ciclo di vita e morire.
    Secondo me la soluzione sarebbe mettere il socket in ascolto continuo fino a quando nn lo decido io.
    Così anche se ci metto tempo ad inserire il testo ed inviarlo, questo nel frattempo non muore, ma rimane sempre in ascolto su quello che gli dico.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    scusami , una volta che tu hai inserito il testo nella textarea ed hai cliccato invio, il campo data viene riempito con il contenuto della textarea.

    quando in seguito verrà cliccato il pulsante, verrà invocato l'evento che gestisce la socket, e la tua stringa dovrebbe arrivare a destinazione.

    cmq questo metodo implica che per ogni stringa inviata al client si deve aprire una connessione, sarebbe meglio aprire la connessione tra client e socket in fase iniziale, dopodichè nella gestione dell'evento del pulsante metti solo la print.

    inoltre, potresti inviare il messaggio direttamente nell'evento che gestisce la tastiera, in modo che quando clicchi invio mandi il messaggio, senza dover usare ancora un JBUTTOn

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Scusami, ma non è logico inserire prima il messaggio e poi premere connetti. Di solito prima ci si connette(premendo il bottone) e poi si scrivono messaggi.

    Non posso mettere la gestione dell'evento out.print nell'evento della keyListner perchè il socket è stato creato altrove e non riconosce il metodo. Dovrei creare la connessione dentro il keyListner e quindi effettuare la connessione qundo premo "invio" nel messaggio e non quando premo connetti.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    il tuo JButton1 in effetti è un connetti-invia-disconnetti tutto in uno...

    di solito si ha un pulsante connetti dove crei la connessione,
    un pulsante invia oppure l'invio da tastiera per iviare i messaggi
    ed un pulsante disconnetti per chiudere la connessione

    se la socketServer e la socket le dichiari come campi della classe server, puoi accedervi in qualsiasi metodo a patto che questa classi implementi i vari listener che gestisci...

    il mio consiglio dunque è di eliminare la classe che implementa l'action listener e quella che estende keyadapter, ed invece usi solo la classe server, la quale implementa sia action listener che keylistener, e poi vai a ridefinire i metodi che ti interessano.
    crea un altro pulsante e lo chiami disconnetti.
    nell'action performed metti un if che riconosce quale pulsante è stato premuto, se è connetti creai la socket, se è disconnetti la chiudi, ovviamente fai in modo che non si possa creare più socket con più click su connetti...

    poi il print lo metti nel keytyped o keypressed...

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.