#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 к моей кнопке! Спасибо, чувак!