Проблема java клиента / сервера — клиент отправляет несколько сообщений при повторном подключении на сервере

#java #user-interface #server #chat

#java #пользовательский интерфейс #сервер #Чат

Вопрос:

я новичок в программировании и, насколько мне удается, открываю свой сервер и подключаю к нему своего клиента. Похоже, что когда я отключаю своего клиента с помощью моего actionPerformed и пытаюсь повторно подключиться, сообщение отправляется дважды. Если я сделаю это снова и повторно подключусь в третий раз, сообщение отправляется 3 раза. Но если я закрою приложение и запущу его заново, никаких проблем. Спасибо за вашу помощь.

Вот мой клиент:

 import java.io.*;
import java.net.*;
import java.awt.event.*;
import Control.fenetre;
import java.io.IOException;


public class Client implements ActionListener, Runnable {
    private static Socket          socket   = null;
    private static DataInputStream streamIn =  null;
    private static DataOutputStream streamOut = null;
    private Thread thread = null;
    boolean quitRequest = false;
    int portSet;
    String nickName;
    String hostName;
    public Client (String nickName, String hostName, int portSet) {
        fenetre.boutonR1.addActionListener(this);
        fenetre.fermerConnexion.addActionListener(this);
        this.nickName = nickName;
        this.hostName = hostName;
        this.portSet = portSet;
        try {
            socket = new Socket(hostName, portSet);
            start();
        }
        catch (IOException ioe) {
            fenetre.statusBar.setText("Error.");
        }
    }
    public void run() {
        while (thread != null amp;amp; quitRequest==false) {
        try {
            open();
            boolean done = false;
            while (!done) {
                try {
                    String line = streamIn.readUTF();
                    fenetre.area.setText(fenetre.area.getText()   "nn" line);
                    done = line.equals(".quit");
                    fenetre.statusBar.setText("Message recu");
                    fenetre.boiteVide();
                }
                catch(IOException ioe)  {
                    done = true;
                }
            }
            close();
        }
        catch(IOException ioe) {
            fenetre.statusBar.setText("Connexion denied.");
        }
      }
    }
    public void start() {  
        if (thread == null) {  
        thread = new Thread(this); 
        thread.start();
      }
   }
    public void open() throws IOException {
        streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    }
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == fenetre.boutonR1) {
            try {
                streamOut = new DataOutputStream(socket.getOutputStream());
                streamOut.writeUTF(nickName "n"  fenetre.area.getText());
                streamOut.flush();
                fenetre.statusBar.setText("Message sent.");
            }
            catch (IOException e1) {
                fenetre.statusBar.setText("Connexion issue.");
                fenetre.boiteVide();
            }
        }
        if (e.getSource() == fenetre.fermerConnexion) {
            try {
                close();
                fenetre.statusBar.setText("Closing the connexion.n");
                fenetre.boiteVide();
            }
            catch (IOException ieo) {
                fenetre.statusBar.setText("Fail.");
            }
        }
    }
    public void close() throws IOException {
        quitRequest = true;
        if (socket != null)    socket.close();
        if (streamIn != null)  streamIn.close();
        if (streamOut != null) streamOut.close();
    }
}
 

Я открываю переподключение с помощью этого:

 private void ouvrirFil() {
        Client porteClient = null;
        porteClient = new Client(nickName, hostName, portSet);
}
 

Комментарии:

1. Вы должны подключать своего слушателя более одного раза.

2. Именно так, каждый раз, когда я создаю объект, я добавляю actionlistener к моей кнопке! Спасибо, чувак!