Comment créer une chambre à Java


Lorsque vous commencez à penser à la façon de créer votre propre personnel de salle de chat, probablement la première chose que vous pensez est lié au réseau d'E/S, les prises, etc., et peut-être vous commencez à vous sentir découragés. Ne soyez pas! Il est une excellente solution qui rend la mise en œuvre d'un tel programme, faciles: JGroups.

Que JGroups? Il se agit d'un système de multidiffusion fiable écrit en Java. De Wikipedia: "Multicast est la livraison d'un message ou de l'information à un groupe d'ordinateurs cibles simultanément dans une seule transmission de la source."




En termes simples, nous pouvons imaginer notre chat de groupe. Chaque utilisateur est un noeud dans ce groupe, et chaque fois qu'un message est envoyé par un noeud, il est délivré à tous les autres noeuds dans le groupe.

Concepts de base de JGroups

Dans notre chat oublier prises et d'autres éléments de réseau de faible niveau, mais nous avons besoin d'apprendre quelques notions de base sur JGroups avant de continuer.

Comme mentionné ci-dessus, nous pouvons voir notre chat en groupe. Pour rejoindre un groupe, et d'envoyer/recevoir des messages, nous avons besoin de canaux. Chaque canal possède sa propre adresse et est connecté à un groupe en utilisant le nom du groupe. Ainsi, un groupe peut avoir beaucoup de voies qui lui sont associés (dans notre cas, un canal pour l'utilisateur).

Les canaux peuvent toujours récupérer une liste des adresses des membres du groupe (dans la pratique, un utilisateur peut voir qui est dans la salle de chat). Nous pouvons également être informé lorsqu'un utilisateur quitte/rejoint la salle de chat.

Time Code

E '!

org.jgroups.JChannel importation; org.jgroups.Message importation; org.jgroups.ReceiverAdapter importation; org.jgroups.View importation; org.jgroups.util.Util importation; javax.swing importation. *; import java.awt. *; java.awt.event.ActionEvent importation; java.awt.event.ActionListener importation; java.io.DataInputStream importation; java.io.DataOutputStream importation; java.io.InputStream importation; java.io.OutputStream importation; java.util.LinkedList importation; import java.util.List; public class étend Guichat ReceiverAdapter { Histoire des finales de la liste = new LinkedList (); Canal JChannel privé; userName private String = System.getProperty ("utilisateur"); JTextField textField privé; JTextArea textArea privé; Main (String [] args) throws Exception {public static void . nouvelle Guichat () start (); } public void viewAccepted (Voir NewView) { appendText ("** Chambre:" + NewView + "\ n"); } public void recevoir (Message msg) { . Ligne String = msg.getObject () toString (); synchronisé (histoire) { history.add (ligne); appendText (ligne); } } public void getState (sortie OutputStream) throws Exception { synchronisé (histoire) { Util.objectToStream (histoire, nouvelle DataOutputStream (sortie)); } } public void setState (InputStream entrée) throws Exception { Liste Liste = (Liste) Util.objectFromStream (nouvelle DataInputStream (entrée)); synchronisé (histoire) { history.clear (); history.addAll (liste); } appendText («réception» list.size + () + "messages dans l'histoire de chat: \ n"); pour (String str: liste) appendText (str); } début de private void () throws Exception { Panneau JPanel createPanel final = (); Canal JChannel = new (); channel.setReceiver (this); channel.connect ("ChatCluster"); channel.getState (null, 10000); javax.swing.SwingUtilities.invokeLater (nouvelle Runnable () { public void run () { JFrame cadre = new JFrame ("Chat Simple"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.add (panneau); frame.pack (); frame.setVisible (true); } }); } createPanel privée JPanel () { JPanel panel = new JPanel (nouvelle GridBagLayout ()); GridBagConstraints GridBagConstraints c = new (); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.HORIZONTAL; c.weightx c.weighty = = 1,0; textArea = new JTextArea (20, 40); textArea.setEditable (false); panel.add (nouvelle JScrollPane (textArea), c); c.weightx c.weighty = = 0,0; c.fill = GridBagConstraints.HORIZONTAL; JPanel messageContainer = new JPanel (nouvelle FlowLayout ()); messageContainer.add (nouvelle JLabel ("Message")); textField = new JTextField (40); textField.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent ae) { Ligne String = "[" + nom d'utilisateur + "]" textField.getText + () + "\ n"; try { channel.send (nouveau message (null, null, ligne)); } Catch (Exception e) { e.printStackTrace (); } } }); messageContainer.add (textField); Bouton JButton = new JButton ("Bonjour!"); button.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent ae) { channel.close (); System.exit (0); } }); messageContainer.add (bouton); panel.add (messageContainer, c); retour du Groupe spécial; } appendText private void (Chaîne de saut de ligne) { textArea.append (tête); textField.setText (""); textArea.setCaretPosition (textArea.getDocument () getLength ().); } }

Le code ci-dessus est un client/serveur salle de chat tout-en-un basé sur JGroups et Swing. Les principales caractéristiques sont:

  • Garder l'historique des chats (comme une liste en mémoire) à envoyer à chaque nouvel utilisateur connecté.
  • Envoyer et recevoir des messages de/vers d'autres utilisateurs.
  • Soyez averti quand quelqu'un quitte/rejoint le chat.

Tout d'abord, Guichat de classe étend org.jgroups.ReceiverAdapter qui détient la majorité du code prêt pour nous, et nous suffit de remplacer uniquement certaines méthodes d'elle.

Pour démarrer une discussion, vous devez définir le canal et de son groupe:

Canal JChannel = new ();
channel.setReceiver (this);
channel.connect ("ChatCluster");
channel.getState (null, 10000);

et quand nous quittons le canal de discussion doit être fermé:

channel.close ();

Pour conserver l'historique de chat à ce jour, selon la méthode:

public void recevoir (Message msg)

Cette méthode est utilisée lorsque nous recevons des messages d'autres utilisateurs (et nous) aussi. En fait, ne oubliez pas que dans un système de multidiffusion, les messages sont envoyés à tous les membres du groupe, y compris l'expéditeur.

Ainsi, lorsque vous recevez un message, il est ajouté à l'histoire-liste et affiché dans la zone de texte.

Pour envoyer un message aux autres membres que nous utilisons la méthode:

channel.send (nouveau message (null, null, ligne));

Les paramètres du constructeur de la classe de message sont, respectivement, adresse de destination, adresse source, et les données soient envoyées. Null sur l'adresse de destination envoie le message à tous les membres du groupe.

Lorsqu'un nouvel utilisateur se joint à la discussion, les membres existants lui envoyer/elle l'histoire avec la méthode:

getState public void (sortie OutputStream) throws Exception

que «flux» (tri) l'objet de l'histoire-liste.

L'histoire reçu est converti (unmarshal) raconte l'histoire-liste avec la méthode:

setState public void (InputStream entrée) throws Exception

Quand un utilisateur entre ou quitte le chat de tous les autres membres sont notifiés par:

public void viewAccepted (Voir NewView)

Pour obtenir une meilleure compréhension de l'API et la fonctionnalité de JGroups je vous recommande de lire la documentation officielle ici.

Compilation et exécution de l'application

Tout d'abord, créer un dossier dans lequel le fichier sera créé GUIChat.java avec le code ci-dessus. Puis télécharger le fichier jar d'ici JGroups (je ai utilisé JGroups-3.2.8.Final.jar).

Pour compiler terme:

JGroups-3.2.8.Final.jar GUIChat.java de javac

et pour exécuter l'application:

java -cp:. JGroups-3.2.8.Final.jar -Duser = john -Djava.net.preferIPv4Stack = true Guichat

Vous pouvez exécuter plusieurs instances de discussion sur la même machine ou sur des machines différentes sur le même réseau.


Eh bien, ce est ça les gars, je espère que vous avez apprécié!

(0)
(0)

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha