Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Homme Profil pro Clément
    Webmaster
    Inscrit en
    juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme Clément
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut [SWT] Gestion des Thread ?

    Bonjour à tous,
    Je suis actuellement en train de développer un Tchat où tous les messages seront cryptés, j'ai fais une interface graphique à l'aide de SWT, le système d'authentification etc etc...

    J'ai fais le choix d'utiliser une base de données MySQL et de communiquer avec à l'aide de L'API JDBC.

    Tout fonctionne parfaitement jusque maintenant.

    Je suis en train de faire l'affichage des membres en ligne, je reste classique, une barre sur le coté avec tout les pseudos des personnes connectées.



    Cela marche parfaitement, je lis la table contenant les membres connectés et je les affiche dans un List avec list.add(String);

    Mais voilà mon problème, j'aimerai que cette liste de membres en ligne s'actualise au cours du temps, si quelqu'un se connecte, que ça l'affiche immédiatement...

    (J'en aurai également besoin pour les messages d'ailleurs ! )

    J'ai pensé à lire en permanence la BDD avec un while(true) dans un Thread
    Mais ça plante le programme... Peut être m'y suis-je mal pris aussi...

    Auriez vous des indications qui me permettraient d'avancer... Des techniques particulières ?

    Merci d'avance pour votre aide

    Cordialement

    MrGlobox




    Voici le code de Tchat.java:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
     
    package chat.client;
     
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.Statement;
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.FormAttachment;
    import org.eclipse.swt.layout.FormData;
    import org.eclipse.swt.layout.FormLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.List;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Menu;
    import org.eclipse.swt.widgets.MenuItem;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.TabFolder;
    import org.eclipse.swt.widgets.TabItem;
    import org.eclipse.swt.widgets.Text;
     
    public class Tchat implements Runnable
    {
    	static String pseudo;
    	static List list;
    	Display display;
     
    	public Tchat(String username) 
    	{
    		pseudo = username;
    	}
     
    	public void run()
    	{
    		onlineWriter();
     
    		//base de la fenetre
    		display = new Display();
    		Shell shell = new Shell(display, SWT.CLOSE | SWT.MIN);
    		shell.setText("Tchat ******");
    		shell.setSize(650, 450);
    		Image image = new Image(display, "favicon.png");
    		shell.setImage(image);
     
    		//met la fenetre de Tchat au milieu de l'écran
    		Rectangle rect = display.getClientArea();
    		Point size = shell.getSize();
    		int x = (rect.width - size.x) / 2;
    		int y = (rect.height - size.y) / 2;
    		shell.setLocation(new Point(x, y));
     
    		//menu du haut
    		Menu menu = new Menu(shell, SWT.BAR);
    		MenuItem optionFichier = new MenuItem(menu, SWT.CASCADE);
    		optionFichier.setText("Fichier");
    		Menu menuFichier = new Menu(shell, SWT.DROP_DOWN);
    		MenuItem optionOuvrir = new MenuItem(menuFichier, SWT.PUSH);
    		optionOuvrir.setText("Ouvrir");
    		MenuItem optionFermer = new MenuItem(menuFichier, SWT.PUSH);
    		optionFermer.setText("Quitter");
    		optionFichier.setMenu(menuFichier);
    		MenuItem optionAide = new MenuItem(menu, SWT.CASCADE);
    		optionAide.setText("Aide");
    		shell.setMenuBar(menu);		
     
    		FormLayout formLayout = new FormLayout();
    		shell.setLayout(formLayout);
     
    		//placement du champs de texte
    		FormData formDataText = new FormData();
    		formDataText.height = 47;
    		formDataText.width = 475;
    		formDataText.top = new FormAttachment(0, 346);
    		formDataText.left = new FormAttachment(0, 3);
     
    		//placement du bouton
    		FormData formDataButton = new FormData();
    		formDataButton.height = 55;
    		formDataButton.width = 123;
    		formDataButton.top = new FormAttachment(0, 345);
    		formDataButton.left = new FormAttachment(0, 520);
     
    		//placement de la liste des onlines
    		FormData formDataList = new FormData();
    		formDataList.height = 315;
    		formDataList.width = 115;
    		formDataList.top = new FormAttachment(0, 21);
    		formDataList.left = new FormAttachment(0, 520);
     
    		//placement des onglets
    		FormData formDataOnglets = new FormData();
    		formDataOnglets.height = 313;
    		formDataOnglets.width = 497;
    		formDataOnglets.left = new FormAttachment(0, 3);
     
    		//création de l'élément "Text" (champs de texte)
    		final Text text = new Text(shell, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI | SWT.WRAP);
    		text.setLayoutData(formDataText);
     
    		//création de l'élement "Button" = Bouto;
    		final Button envoyer = new Button(shell, SWT.PUSH);
    //		final Cursor cursor = new Cursor(display, SWT.CURSOR_HAND);;
    		envoyer.setText("Envoyer");
    		envoyer.setLayoutData(formDataButton);
     
    		envoyer.addListener(SWT.Selection, new Listener() {
    			  public void handleEvent(Event e) 
    			  {
    				  text.setText("");
    			  }
    			  });
     
    		//Gestion des membres en ligne
    		list = new List(shell, SWT.BORDER);
    		list.setLayoutData(formDataList);
    		list.add(pseudo);
     
    		display.asyncExec(new RequetePseudos());
     
     
    		TabFolder tabfolder = new TabFolder(shell, SWT.NONE);
    		tabfolder.setLayoutData(formDataOnglets);
    		TabItem onglet1 = new TabItem(tabfolder, SWT.NONE);
    		onglet1.setText("Channel Général");
    		TabItem onglet2 = new TabItem(tabfolder, SWT.NONE);
    		onglet2.setText("Onglet 2");
    		TabItem onglet3 = new TabItem(tabfolder, SWT.NONE);
    		onglet3.setText("Onglet 3");
     
    		shell.open();
     
    		while (!shell.isDisposed()) 
    		{
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
     
    		//deconnexion dans la BDD
    		try
    		{
    			Statement state = Connect.getInstance().createStatement();
    			state.executeUpdate("DELETE FROM online WHERE pseudo = '" + pseudo + "'");
    		}
     
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
     
    		// libération de la mémoire
    		display.dispose();
    	}
     
    	public static void onlineWriter()
    	{
    			try
    			{			
    				Statement state = Connect.getInstance().createStatement();
    				ResultSet result = state.executeQuery("SELECT pseudo FROM online");
    				ResultSetMetaData resultMeta = result.getMetaData();
    				boolean test = false;
     
    				while(result.next())
    				{			
    					for(int i = 1; i <=  resultMeta.getColumnCount(); i++)
    					{
    						String resultats = result.getObject(i).toString();
     
    						if(resultats.equals(pseudo))
    							test = true;
    					}				
    				}
     
    				if(!test)
    					state.executeUpdate("INSERT INTO online (pseudo) VALUES('" + pseudo + "')");
    			}
     
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    	}
     
    	private class RequetePseudos extends Thread
    	{
    		public void run() 
    		{
    				try
    				{
    					Statement state = Connect.getInstance().createStatement(); // connexion à la BDD
     
    					// je souhaitais mettre un while(true) ici
     
    					ResultSet result = state.executeQuery("SELECT pseudo FROM online"); //requete SQL
    					ResultSetMetaData resultMeta = result.getMetaData();
     
    						while(result.next())
    						{			
    							for(int i = 1; i <=  resultMeta.getColumnCount(); i++)
    							{
    								String resultats = result.getObject(i).toString();
     
    								if(!resultats.equals(pseudo))
    									list.add(resultats);
    							}				
    						}					
    				}
     
    				catch (Exception e) 
    				{
    					e.printStackTrace();
    				}
    		}
    	}
    }

  2. #2
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2007
    Messages : 1 800
    Points : 3 776
    Points
    3 776

    Par défaut

    Salut,

    Déjà, des requêtes BDD dans un client, ça me paraît louche .
    T'as bien prévu une architecture client / serveur non?
    Parce que là, c'est le serveur qui va prévenir les clients qu'il ya une nouvelle connexion. C'est pas le client qui demande tout le temps au serveur...
    Quelques infos sur ton architecture ne serait pas de trop

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Invité de passage
    Homme Profil pro Clément
    Webmaster
    Inscrit en
    juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme Clément
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : juillet 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Bonsoir,

    Tout d'abord merci de ta réponse

    Je n'ai aucun soucis sur la connexion à la base de données coté client, c'est une application à usage privé (avec des amis), et j'aurai aimé éviter l'utilisation d'application serveur, même si c'est ce que je vais faire si jamais je ne trouve pas de solution...

    Amicalement

    MrGlobox

  4. #4
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2007
    Messages : 1 800
    Points : 3 776
    Points
    3 776

    Par défaut

    Salut,

    Alors quand je parle archi client / server, le server peut être tout à fait anodin et se résumer à un démon qui écouterait une socket...
    Tout simplement. Et ça me paraît plus "équilibré" aussi de lui confier, à lui seul, les interactions avec la BD.
    Mais ce n'est que mon avis hein
    En plus, ça te faciliterait la gestion de ton application.

    Après, rien ne t'empêche de garder ton application dans l'état courant et de faire un démon qui s'occuperait d'envoyer des requêtes "régulièrement" à la BD pour connaître ceux qui sont connectés. Un démon est un Thread qui tourne "indéfiniment". Il s'agit ensuite de communication entre Thread. Du moins, entre le thread IHM et ton démon pour les mises à jour IHM à effectuer. Il te faut, bien entendu, lancer ce démon en dehors du thread IHM.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    Invité régulier
    Homme Profil pro
    Ingénieur en apprentissage
    Inscrit en
    août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en apprentissage
    Secteur : Industrie

    Informations forums :
    Inscription : août 2012
    Messages : 12
    Points : 8
    Points
    8

    Par défaut

    Bonjour,

    Dans le cadre d'un projet j'avais utilisé la bibliothèque java Kryonet.
    http://code.google.com/p/kryonet/

    Je me rappelle qu'un des snippets était un chat qui se rapproche fortement de ce que tu décris.

  6. #6
    Invité de passage
    Homme Profil pro Marouan El khebir
    Ingénieur développement logiciels
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Marouan El khebir
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2012
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Bonjour,

    Si tu es entrain de développé ton application chat en IHM, le mieux c'est de passer par les sockets (client/serveur). et il faut mettre en place un protocole de communication.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •