mirror of
https://github.com/Akomry/sae302_applicom.git
synced 2025-12-06 11:43:53 +00:00
feat(net): Modification méthode handleConnection, fin de ChatClient et de ClientTCP
This commit is contained in:
parent
0d13bc526b
commit
8ec377bec0
5 changed files with 269 additions and 11 deletions
|
|
@ -24,10 +24,8 @@ import net.synedra.validatorfx.TooltipWrapper;
|
|||
import net.synedra.validatorfx.Validator;
|
||||
import rtgre.chat.graphisme.ContactListViewCell;
|
||||
import rtgre.chat.graphisme.PostListViewCell;
|
||||
import rtgre.modeles.Contact;
|
||||
import rtgre.modeles.ContactMap;
|
||||
import rtgre.modeles.Message;
|
||||
import rtgre.modeles.Post;
|
||||
import rtgre.chat.net.ChatClient;
|
||||
import rtgre.modeles.*;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
|
|
@ -38,6 +36,7 @@ import java.util.Date;
|
|||
import java.util.Objects;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static rtgre.chat.ChatApplication.LOGGER;
|
||||
|
|
@ -46,10 +45,11 @@ public class ChatController implements Initializable {
|
|||
|
||||
private static final Pattern LOGIN_PATTERN = Pattern.compile("^([a-z][a-z0-9]{2,7})$");
|
||||
private static final Pattern HOST_PATTERN = Pattern.compile("/^[a-z]*((\\:?)\\d{1,5})?$/gm");
|
||||
private final Pattern hostPortPattern = Pattern.compile("^([-.a-zA-Z0-9]+)(?::([0-9]{1,5}))?$");
|
||||
public MenuItem hostAddMenuItem;
|
||||
public MenuItem avatarMenuItem;
|
||||
public MenuItem aboutMenuItem;
|
||||
public ComboBox hostComboBox;
|
||||
public ComboBox<String> hostComboBox;
|
||||
public TextField loginTextField;
|
||||
public ToggleButton connectionButton;
|
||||
public ImageView avatarImageView;
|
||||
|
|
@ -66,6 +66,8 @@ public class ChatController implements Initializable {
|
|||
private ObservableList<Contact> contactObservableList = FXCollections.observableArrayList();
|
||||
private ObservableList<Post> postsObservableList = FXCollections.observableArrayList();
|
||||
Validator validatorLogin = new Validator();
|
||||
private ChatClient client = null;
|
||||
private PostVector postVector;
|
||||
|
||||
|
||||
@Override
|
||||
|
|
@ -147,7 +149,38 @@ public class ChatController implements Initializable {
|
|||
contactMap.put(this.contact.getLogin(), this.contact);
|
||||
LOGGER.info("Nouveau contact : " + contact);
|
||||
LOGGER.info(contactMap.toString());
|
||||
Matcher matcher = hostPortPattern.matcher("localhost:2024");
|
||||
matcher.matches();
|
||||
String host = matcher.group(1);
|
||||
int port = (matcher.group(2) != null) ? Integer.parseInt(matcher.group(2)) : 2024;
|
||||
try {
|
||||
this.client = new ChatClient(host, port, this);
|
||||
initContactListView();
|
||||
initPostListView();
|
||||
clearLists();
|
||||
contactMap.add(this.contact);
|
||||
this.contact.setConnected(true);
|
||||
initContactListView();
|
||||
initPostListView();
|
||||
this.statusLabel.setText("Connected to %s@%s:%s".formatted(this.contact.getLogin(), host, port));
|
||||
} catch (IOException e) {
|
||||
new Alert(Alert.AlertType.ERROR, "Erreur de connexion").showAndWait();
|
||||
connectionButton.setSelected(false);
|
||||
}
|
||||
} else if (!connectionButton.isSelected()) {
|
||||
clearLists();
|
||||
this.client.close();
|
||||
this.contact.setConnected(false);
|
||||
statusLabel.setText("not connected to " + hostComboBox.getValue());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void clearLists() {
|
||||
this.contactMap = new ContactMap();
|
||||
this.postVector = new PostVector();
|
||||
contactObservableList.clear();
|
||||
postsObservableList.clear();
|
||||
}
|
||||
|
||||
private void checkLogin(Check.Context context) {
|
||||
|
|
@ -185,10 +218,7 @@ public class ChatController implements Initializable {
|
|||
contactsListView.setCellFactory(contactListView -> new ContactListViewCell());
|
||||
contactsListView.setItems(contactObservableList);
|
||||
File avatars = new File(getClass().getResource("avatars.png").toURI());
|
||||
Contact riri = new Contact("riri", false, avatars);
|
||||
Contact fifi = new Contact("fifi", true, avatars);
|
||||
contactObservableList.add(riri);
|
||||
contactMap.add(riri);
|
||||
contactObservableList.add(fifi);
|
||||
contactMap.add(fifi);
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
53
chat/src/main/java/rtgre/chat/net/ChatClient.java
Normal file
53
chat/src/main/java/rtgre/chat/net/ChatClient.java
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package rtgre.chat.net;
|
||||
|
||||
import rtgre.chat.ChatController;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static rtgre.chat.ChatApplication.LOGGER;
|
||||
|
||||
public class ChatClient extends ClientTCP {
|
||||
|
||||
private final ChatController listener;
|
||||
|
||||
/**
|
||||
* Le constructeur ouvre la connexion TCP au serveur <code>host:port</code>
|
||||
* et récupère les flux de caractères en entrée {@link #in} et sortie {@link #out}
|
||||
* import static rtgre.chat.ChatApplication.LOGGER;
|
||||
*
|
||||
* @param host IP ou nom de domaine du serveur
|
||||
* @param port port d'écoute du serveur
|
||||
* @param listener instance de ChatController liée au client
|
||||
* @throws IOException
|
||||
*/
|
||||
public ChatClient(String host, int port, ChatController listener) throws IOException {
|
||||
super(host, port);
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void receiveLoop() {
|
||||
LOGGER.info(RED + "Boucle de réception de messages..." + RST);
|
||||
try {
|
||||
while (connected) {
|
||||
String message = this.receive();
|
||||
LOGGER.info(RED + "Réception: " + message + RST);
|
||||
LOGGER.info(RED + message + RST);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOGGER.severe("[%s] %s".formatted(ipPort, e));
|
||||
connected = false;
|
||||
} finally {
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
return LOGGER;
|
||||
}
|
||||
|
||||
public ChatController getListener() {
|
||||
return listener;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
package rtgre.chat.net;
|
||||
|
||||
import rtgre.chat.ChatController;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
|
@ -19,15 +21,16 @@ public class ClientTCP {
|
|||
public static final String RST = "\u001b[0m";
|
||||
public static final String END_MESSAGE = "fin";
|
||||
|
||||
/*
|
||||
static {
|
||||
try {
|
||||
InputStream is = ClientTCP.class.getClassLoader()
|
||||
.getResource("logging.properties").openStream();
|
||||
.getResource("rtgre/chat/logging.properties").openStream();
|
||||
LogManager.getLogManager().readConfiguration(is);
|
||||
} catch (Exception e) {
|
||||
LOGGER.log(Level.INFO, "Cannot read configuration file", e);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
/*
|
||||
|
|
@ -94,6 +97,9 @@ public class ClientTCP {
|
|||
LOGGER.fine("[%s] Conversion flux d'octets en flux de caractères UTF-8".formatted(ipPort));
|
||||
out = new PrintStream(os, true, StandardCharsets.UTF_8);
|
||||
in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8), 2048);
|
||||
Thread rcLoop = new Thread(this::receiveLoop);
|
||||
rcLoop.setDaemon(true);
|
||||
rcLoop.start();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ handlers=java.util.logging.ConsoleHandler, java.util.logging.FileHandler
|
|||
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
|
||||
|
||||
# Nom du fichier de logs
|
||||
java.util.logging.FileHandler.pattern=../out/java%u.log
|
||||
java.util.logging.FileHandler.pattern=../target/java%u.log
|
||||
|
||||
# Format de logs plus compact sur 1 seule ligne
|
||||
java.util.logging.SimpleFormatter.format=%1$tF %1$tT.%1$tL | %4$-7s | %2$s | %5$s %6$s%n
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue