|
@@ -1,3 +1,8 @@
|
|
1
|
+import java.awt.BorderLayout;
|
|
2
|
+import java.awt.Component;
|
|
3
|
+import java.awt.GridLayout;
|
|
4
|
+import java.awt.event.ActionEvent;
|
|
5
|
+import java.awt.event.ActionListener;
|
1
|
6
|
import java.io.BufferedReader;
|
2
|
7
|
import java.io.IOException;
|
3
|
8
|
import java.io.InputStreamReader;
|
|
@@ -6,7 +11,8 @@ import java.net.*;
|
6
|
11
|
import java.text.DateFormat;
|
7
|
12
|
import java.text.SimpleDateFormat;
|
8
|
13
|
import java.util.Date;
|
9
|
|
-import java.util.Scanner; // Import the Scanner class
|
|
14
|
+import javax.swing.JOptionPane;
|
|
15
|
+
|
10
|
16
|
import java.util.ArrayList; // import the ArrayList class
|
11
|
17
|
|
12
|
18
|
|
|
@@ -30,22 +36,25 @@ public class User{
|
30
|
36
|
protected UserListeningThreadUDP threadListeningUDP; // UDP listening thread (pour répondre aux nouveaux utilisateurs)
|
31
|
37
|
protected UserListeningThreadTCP threadListeningTCP; // TCP listening thread (pour commencer une nouvelle conversation)
|
32
|
38
|
|
33
|
|
- /* Constructor of User (local)
|
|
39
|
+ /**
|
|
40
|
+ * Constructor of User (local)
|
34
|
41
|
* $parametres
|
35
|
42
|
* * portUDPsend : int => le numéro de port pour envoyé ces informations lors d'un changements ou d'une nouvelle connexion
|
36
|
43
|
* * portUDPlistening : int => le numéro de port pour recevoir les informations des nouveaux utilisateurs ou les changements
|
37
|
44
|
* * portTCP : int => le numéro de port pour commencer une nouvelle conversation
|
38
|
|
- *
|
39
|
|
- * $description : On récupère l'adresse de la machine, le numéro de port à utiliser, on demande un pseudo à l'utilisateur
|
|
45
|
+ * <p>
|
|
46
|
+ * On récupère l'adresse de la machine, le numéro de port à utiliser, on demande un pseudo à l'utilisateur
|
40
|
47
|
* que l'on vérifie, une fois validé, l'utilisateur devient actif (Début de l'écoute UDP pour les pseudos et notification aux autres utilisateurs actifs)
|
|
48
|
+ * </p>
|
41
|
49
|
*/
|
|
50
|
+
|
42
|
51
|
public User(int portUDPsend,int portUDPlistening,int portTCP) throws IOException{
|
43
|
52
|
try
|
44
|
53
|
{
|
45
|
54
|
this.addIP = InetAddress.getLocalHost();
|
46
|
55
|
}
|
47
|
56
|
catch(UnknownHostException e) {
|
48
|
|
- System.out.println("Could not find local address!");
|
|
57
|
+ JOptionPane.showMessageDialog(null ,"Could not find local address!");
|
49
|
58
|
}
|
50
|
59
|
|
51
|
60
|
this.portUDPsend = portUDPsend;
|
|
@@ -55,18 +64,20 @@ public class User{
|
55
|
64
|
this.initPseudo();
|
56
|
65
|
|
57
|
66
|
this.active();
|
58
|
|
-
|
59
|
67
|
}
|
60
|
|
- /*
|
|
68
|
+
|
|
69
|
+ /**
|
61
|
70
|
* Constructor of User (simulation of remote user)
|
62
|
71
|
* $parametres
|
63
|
72
|
* * portUDPsend : int => le numéro de port pour envoyé ces informations lors d'un changements ou d'une nouvelle connexion
|
64
|
73
|
* * portUDPlistening : int => le numéro de port pour recevoir les informations des nouveaux utilisateurs ou les changements
|
65
|
74
|
* * portTCP : int => le numéro de port pour commencer une nouvelle conversation
|
66
|
75
|
* * pseudo : String => le pseudo avec lequel on initie l'utilisateur distant (! pas de vérification)
|
67
|
|
- *
|
68
|
|
- * $description : On récupère l'adresse de la machine, le numéro de port à utiliser, on demande un pseudo à l'utilisateur
|
69
|
|
- * que l'on vérifie, une fois validé, l'utilisateur devient actif (Début de l'écoute UDP pour les pseudos et notification aux autres utilisateurs actifs)
|
|
76
|
+ * <p>
|
|
77
|
+ * On récupère l'adresse de la machine, le numéro de port à utiliser, on demande un pseudo à l'utilisateur
|
|
78
|
+ * que l'on vérifie, une fois validé, l'utilisateur devient actif (Début de l'écoute UDP pour les pseudos
|
|
79
|
+ * et notification aux autres utilisateurs actifs)
|
|
80
|
+ * </p>
|
70
|
81
|
*/
|
71
|
82
|
public User(int portUDPsend,int portUDPlistening, int portTCP,String pseudo) {
|
72
|
83
|
try
|
|
@@ -74,7 +85,7 @@ public class User{
|
74
|
85
|
this.addIP = InetAddress.getLocalHost();
|
75
|
86
|
}
|
76
|
87
|
catch(UnknownHostException e) {
|
77
|
|
- System.out.println("Could not find local address!");
|
|
88
|
+ JOptionPane.showMessageDialog(null ,"Could not find local address!");
|
78
|
89
|
}
|
79
|
90
|
this.portUDPsend = portUDPsend;
|
80
|
91
|
this.portUDPlistening = portUDPlistening;
|
|
@@ -119,58 +130,51 @@ public class User{
|
119
|
130
|
public void setPortUDPsend(int portUDPsend) {
|
120
|
131
|
this.portUDPsend = portUDPsend;
|
121
|
132
|
}
|
122
|
|
- /*setPseudo
|
123
|
|
- * $description
|
124
|
|
- * Demande à l'utilisateur de rentrer un pseudo et validation de ce dernier en demandant aux utilisateurs distants leurs informations
|
|
133
|
+
|
|
134
|
+ /**
|
|
135
|
+ * <p>
|
|
136
|
+ * Demande à l'utilisateur de rentrer un pseudo et valide de ce dernier en demandant aux
|
|
137
|
+ * utilisateurs distants leurs informations.
|
125
|
138
|
* On regarde si le pseudo est bien différent de l'ancien
|
|
139
|
+ * </p>
|
126
|
140
|
*/
|
127
|
|
-
|
128
|
|
-
|
129
|
|
-
|
130
|
141
|
private void setPseudo() throws IOException {
|
131
|
142
|
String oldPseudo = this.pseudo; //Saves the old one for comparison
|
132
|
143
|
|
133
|
|
- Scanner sc3 = new Scanner(System.in); // Create a Scanner object
|
134
|
|
- System.out.println("Enter new nickname :");
|
135
|
|
- String tmpPseudo = sc3.nextLine(); // Read user input
|
|
144
|
+ String tmpPseudo = JOptionPane.showInputDialog(null, "Enter nickname:"); // Read user input
|
136
|
145
|
|
137
|
146
|
while(!(this.validatePseudo(tmpPseudo)) || tmpPseudo.equals(oldPseudo)) {
|
138
|
|
- System.out.println("Already exist, enter another nickname :");
|
139
|
|
- tmpPseudo = sc3.nextLine(); // Read user input
|
|
147
|
+ tmpPseudo = JOptionPane.showInputDialog(null, "Already exist, enter another nickname :"); // Read user input
|
140
|
148
|
}
|
141
|
149
|
|
142
|
150
|
this.pseudo = tmpPseudo;
|
143
|
151
|
//myObj.close();
|
144
|
|
- System.out.println("Your new nickname : " + tmpPseudo + " is valid !");
|
|
152
|
+ JOptionPane.showMessageDialog(null ,"Your new nickname : " + tmpPseudo + " is valid !");
|
145
|
153
|
|
146
|
154
|
notify_remote_user();
|
147
|
155
|
}
|
148
|
|
-
|
149
|
|
-
|
150
|
|
- /*** PROCEDURES ***/
|
151
|
|
-
|
152
|
156
|
|
153
|
|
- /*initPseudo
|
154
|
|
- * $description
|
155
|
|
- * Demande à l'utilisateur de rentrer un pseudo et validation de ce dernier en demandant aux utilisateurs distants leurs informations
|
|
157
|
+ /**
|
|
158
|
+ * <p>
|
|
159
|
+ * Demande à l'utilisateur de rentrer un pseudo et valide de ce dernier en demandant aux
|
|
160
|
+ * utilisateurs distants leurs informations
|
|
161
|
+ * </p>
|
156
|
162
|
*/
|
157
|
163
|
public void initPseudo() throws IOException {
|
158
|
|
- Scanner sc1 = new Scanner(System.in); // Create a Scanner object
|
159
|
|
- System.out.println("Enter nickname :");
|
160
|
|
- String tmpPseudo = sc1.nextLine(); // Read user input
|
|
164
|
+ String tmpPseudo = JOptionPane.showInputDialog(null, "Enter nickname:"); // Read user input
|
161
|
165
|
|
162
|
166
|
while(!(this.validatePseudo(tmpPseudo))) { // On demande aux autres utilisateurs de nous envoyer leurs informations et on test si le pseudo est déjà utilisé
|
163
|
|
- System.out.println("Enter another nickname :");
|
164
|
|
- tmpPseudo = sc1.nextLine(); // Read user input
|
|
167
|
+ tmpPseudo = JOptionPane.showInputDialog(null, "Enter another nickname:"); // Read user input
|
165
|
168
|
}
|
166
|
169
|
|
167
|
170
|
this.pseudo = tmpPseudo;
|
168
|
171
|
//sc1.close();
|
169
|
|
- System.out.println("Your nickname : " + tmpPseudo + " is valid !");
|
|
172
|
+ JOptionPane.showMessageDialog(null ,"Your nickname : " + tmpPseudo + " is valid !");
|
170
|
173
|
}
|
171
|
174
|
|
172
|
175
|
public void TCPmessage(int index) throws IOException {
|
173
|
176
|
Socket link=null;
|
|
177
|
+ String s1;
|
174
|
178
|
try {
|
175
|
179
|
link=new Socket(this.userChatList.get(index).addIP,this.userChatList.get(index).portTCP);
|
176
|
180
|
|
|
@@ -194,7 +198,7 @@ public class User{
|
194
|
198
|
e.printStackTrace();
|
195
|
199
|
}
|
196
|
200
|
String input;
|
197
|
|
- System.out.println(this.getPseudo()+" reçoit un message");
|
|
201
|
+ String s2 = (this.getPseudo()+" reçoit un message");
|
198
|
202
|
try {
|
199
|
203
|
while (!(input=in.readLine()).equals("end")) {
|
200
|
204
|
System.out.print("client_recoit:"+input);
|
|
@@ -217,14 +221,18 @@ public class User{
|
217
|
221
|
}
|
218
|
222
|
|
219
|
223
|
|
220
|
|
- /* validatePseudo
|
221
|
|
- * $parametres
|
|
224
|
+ /**
|
|
225
|
+ * <p>
|
222
|
226
|
* *tmpPseudo : String => Le pseudo à valider
|
223
|
|
- * $description
|
224
|
|
- * On envoi en broadcast (pour l'instant envoi sur les ports de notre ordinateur) d'une demande d'information
|
225
|
|
- * On attends les réponses pendant 5 secondes
|
|
227
|
+ *</p><p>
|
|
228
|
+ * Envoi en broadcast (pour l'instant envoi sur les ports de notre ordinateur) d'une demande d'information
|
|
229
|
+ *</p><p>
|
|
230
|
+ * On attend les réponses pendant 5 secondes
|
|
231
|
+ *</p><p>
|
226
|
232
|
* On valide le pseudo en fonction des pseudos reçu
|
227
|
|
- * On en profites pour ajouter les utilisateurs répondant à notre liste d'utilisateur distant (RemoteUser)
|
|
233
|
+ *</p><p>
|
|
234
|
+ * On en profite pour ajouter les utilisateurs répondant à notre liste d'utilisateur distant (RemoteUser)
|
|
235
|
+ * </p>
|
228
|
236
|
*/
|
229
|
237
|
public Boolean validatePseudo(String tmpPseudo) throws IOException {
|
230
|
238
|
|
|
@@ -279,10 +287,10 @@ public class User{
|
279
|
287
|
tabresponse = response.split(":");
|
280
|
288
|
|
281
|
289
|
// Affichage de la réponse
|
282
|
|
- System.out.println("Remote user n°"+nbReponse);
|
283
|
|
- System.out.println("\tIP : "+tabresponse[0]);
|
284
|
|
- System.out.println("\tn°Port : "+tabresponse[1]);
|
285
|
|
- System.out.println("\tpseudo : "+tabresponse[2]);
|
|
290
|
+ System.out.println("Remote user n°"+nbReponse+
|
|
291
|
+ "\nIP : "+tabresponse[0]+
|
|
292
|
+ "\nn°Port : "+tabresponse[1]+
|
|
293
|
+ "\npseudo : "+tabresponse[2]);
|
286
|
294
|
|
287
|
295
|
// Si reception on ajoute l'utilisateur à notre liste d'utilisateur distant
|
288
|
296
|
this.addRemoteUser(InetAddress.getByName(tabresponse[0].split("/")[1]),Integer.parseInt(tabresponse[1]),tabresponse[2]);
|
|
@@ -295,19 +303,22 @@ public class User{
|
295
|
303
|
dgramSocket.close();
|
296
|
304
|
|
297
|
305
|
if(!valid) {
|
298
|
|
- System.out.println("Nickname : "+tmpPseudo +" is taken !");
|
|
306
|
+ JOptionPane.showMessageDialog(null ,"Nickname : "+tmpPseudo +" is taken !");
|
299
|
307
|
}
|
300
|
308
|
|
301
|
309
|
return valid;
|
302
|
310
|
}
|
303
|
311
|
|
304
|
|
- /*addRemoteUser
|
305
|
|
- * $parametres
|
|
312
|
+ /**
|
|
313
|
+ * <p>
|
306
|
314
|
* *remoteUserIP : InetAddress => l'adresse IP de l'utilisateur distant
|
|
315
|
+ * </p><p>
|
307
|
316
|
* *remoteUserPortTCP : int => le numéro de port TCP d'écoute de l'utilisateur distant
|
|
317
|
+ * </p><p>
|
308
|
318
|
* *remoteUserPseudo : String => le pseudo de l'utilisateur distant
|
309
|
|
- * $description
|
310
|
|
- * On ajoute ou mise à jour l'utilisateur distant dans notre liste d'utilisateur distant
|
|
319
|
+ * </p><p>
|
|
320
|
+ * Ajout ou mise à jour l'utilisateur distant dans notre liste d'utilisateur distant
|
|
321
|
+ * </p>
|
311
|
322
|
*/
|
312
|
323
|
public void addRemoteUser(InetAddress remoteUserIP, int remoteUserPortTCP,String remoteUserPseudo) {
|
313
|
324
|
RemoteUser tmpRemoteUser = new RemoteUser(remoteUserIP,remoteUserPortTCP,remoteUserPseudo);
|
|
@@ -322,9 +333,10 @@ public class User{
|
322
|
333
|
}
|
323
|
334
|
}
|
324
|
335
|
|
325
|
|
- /* notify_remote_user
|
326
|
|
- * $description
|
327
|
|
- * En utilisant le port UDP d'envoi, on envoi en broadcast les informations nous concernant
|
|
336
|
+ /**
|
|
337
|
+ * <p>
|
|
338
|
+ * En utilisant le port UDP d'envoi, on envoie en broadcast les informations nous concernant
|
|
339
|
+ * </p>
|
328
|
340
|
*/
|
329
|
341
|
public void notify_remote_user() {
|
330
|
342
|
// Création du socket d'envoi d'information
|
|
@@ -364,11 +376,14 @@ public class User{
|
364
|
376
|
dgramSocket.close();
|
365
|
377
|
}
|
366
|
378
|
|
367
|
|
- /*active
|
368
|
|
- * $ description
|
369
|
|
- * On démarre un thread d'écoute UDP pour répondre au nouveaux utilisateurs
|
370
|
|
- * On démarre un thread d'écoute TCP pour commencer une conversation avec les utilisateurs actifs
|
371
|
|
- * On notifie les utilisateurs distants actifs de notre passage en mode actif (envoi de nos informations)
|
|
379
|
+ /**
|
|
380
|
+ * <p>
|
|
381
|
+ * On démarre un thread d'écoute UDP pour répondre au nouveaux utilisateurs,
|
|
382
|
+ * </p><p>
|
|
383
|
+ * On démarre un thread d'écoute TCP pour commencer une conversation avec les utilisateurs actifs,
|
|
384
|
+ * </p><p>
|
|
385
|
+ * On notifie les utilisateurs distants actifs de notre passage en mode actif (envoi de nos informations)
|
|
386
|
+ * </p>
|
372
|
387
|
*/
|
373
|
388
|
private void active() {
|
374
|
389
|
this.threadListeningUDP = new UserListeningThreadUDP("UDP Listening thread",this);
|
|
@@ -382,47 +397,46 @@ public class User{
|
382
|
397
|
this.actif=true;
|
383
|
398
|
}
|
384
|
399
|
|
385
|
|
- /*printRemoteUserList
|
386
|
|
- * $descrition
|
387
|
|
- * Affichage de la liste d'utilisateur actif avec leurs index dans la liste
|
|
400
|
+ /**
|
|
401
|
+ * <p>
|
|
402
|
+ * Affichage de la liste d'utilisateurs actifs avec leurs index dans la liste
|
|
403
|
+ * </p>
|
388
|
404
|
*/
|
389
|
405
|
public void printRemoteUserList() {
|
390
|
|
- System.out.println("\nInternal list of active remote users:");
|
391
|
|
-
|
|
406
|
+ System.out.println("Internal list of active remote users:");
|
|
407
|
+
|
392
|
408
|
for(int i=0; i<this.remoteUserList.size(); i++) {
|
393
|
|
- System.out.println("- ("+i+") Username: " + this.remoteUserList.get(i).getPseudo());
|
|
409
|
+ System.out.println("- ("+i+") Username: " + this.remoteUserList.get(i).getPseudo());
|
394
|
410
|
}
|
395
|
411
|
}
|
396
|
412
|
|
397
|
|
- /*getOneActiveUser
|
398
|
|
- * $description
|
399
|
|
- * Laisse l'utilisateur choisir parmis la liste d'utilisateur actif celui avec lequel il souhaite échangé via un chat
|
|
413
|
+ /**
|
|
414
|
+ * <p>
|
|
415
|
+ * Laisse l'utilisateur choisir parmis la liste d'utilisateurs actifs celui avec lequel il souhaite échanger via un chat
|
|
416
|
+ *</p>
|
400
|
417
|
*/
|
401
|
418
|
public void getOneActiveUser() throws IOException {
|
402
|
419
|
this.printRemoteUserList();
|
403
|
|
- Scanner sc2= new Scanner(System.in);
|
404
|
|
- System.out.println("Please, enter index of one active user that you saw on the list to start a conversation with:");
|
405
|
|
- int index=Integer.parseInt(sc2.nextLine());
|
|
420
|
+ int index=Integer.parseInt(JOptionPane.showInputDialog(null, "Please, enter index of one active user that you saw on the list to start a conversation with:"));
|
406
|
421
|
|
407
|
422
|
if (index >= 0 && index<remoteUserList.size()) {
|
408
|
423
|
if(userChatList.contains(remoteUserList.get(index))) {
|
409
|
|
- System.out.println("User "+remoteUserList.get(index).getPseudo()+" is already in chat with you");
|
|
424
|
+ JOptionPane.showMessageDialog(null ,"User "+remoteUserList.get(index).getPseudo()+" is already in chat with you");
|
410
|
425
|
}
|
411
|
426
|
else {
|
412
|
427
|
userChatList.add(remoteUserList.get(index));
|
413
|
|
- System.out.println("New chat with "+remoteUserList.get(index).getPseudo());
|
|
428
|
+ JOptionPane.showMessageDialog(null ,"New chat with "+remoteUserList.get(index).getPseudo());
|
414
|
429
|
}
|
415
|
430
|
}
|
416
|
431
|
else {
|
417
|
|
- System.out.println("Wrong index (no active at index number "+index+" )");
|
|
432
|
+ JOptionPane.showMessageDialog(null ,"Wrong index (no active at index number "+index+" )");
|
418
|
433
|
}
|
419
|
434
|
|
420
|
435
|
this.TCPmessage(index);
|
421
|
436
|
//sc2.close();
|
422
|
437
|
}
|
423
|
|
-
|
|
438
|
+
|
424
|
439
|
public static void main(String[] args) throws IOException, InterruptedException {
|
425
|
|
-
|
426
|
440
|
// Création des utilisateurs
|
427
|
441
|
User usr2 = new User(12226,portUDPlistening_remoteUsr2,22222,"Mike"); // simulation d'un utilisateur distant n1
|
428
|
442
|
User usr3 = new User(12224,portUDPlistening_remoteUsr3,22223,"Alice"); // simulation d'un utilisateur distant n2
|
|
@@ -446,7 +460,7 @@ public class User{
|
446
|
460
|
usr1.threadListeningTCP.close();
|
447
|
461
|
usr2.threadListeningTCP.close();
|
448
|
462
|
usr3.threadListeningTCP.close();
|
449
|
|
- System.out.println("End");
|
|
463
|
+ JOptionPane.showMessageDialog(null ,"End");
|
450
|
464
|
|
451
|
465
|
|
452
|
466
|
}
|