Étant donné que je dois créer une conception de cours de réseau informatique réseau et que je ne veux pas faire de câblage réseau ou de configuration du routeur LAN, etc., j'ai finalement décidé d'utiliser Socket pour écrire une salle de chat LAN basée sur Java:
Pour plus d'informations sur la programmation du socket et du réseau, veuillez vous référer à mon autre article: Programmation basée sur Java Socket
Le programme est basé sur la structure C / S, c'est-à-dire le mode serveur client.
serveur:
L'IP par défaut est une IP native
Les deux parties doivent déterminer un numéro de port pour définir le nombre maximum de personnes connectées. L'interface peut être démarrée et fermée pour afficher l'utilisateur et le nom en ligne (cette unité n'est pas affichée ici)
Client:
Besoin de définir manuellement l'adresse IP du serveur (LAN)
Définissez manuellement le numéro de port et entrez le nom pour connecter et déconnecter l'interface en cours d'exécution du programme comme suit:
serveur:
Client:
Je téléchargerai le code spécifique à la fin.
Il existe de nombreuses lacunes dans les logiciels, tels que:
Il n'y a pas d'optimisation d'intersection avec la base de données: tous les utilisateurs peuvent être stockés dans la base de données et les enregistrements de chat peuvent également être placés dans la base de données. L'optimisation de chat individuelle n'est pas mise en œuvre: il y a encore de nombreuses lacunes dans la méthode de redéfinition du chat individuel. Si vous vous y intéressez, revenez et étudiez-le lentement.
Voici trois codes pour le programme:
User.java
classe publique User {/ ** * Classe d'informations utilisateur * Utilisé pour enregistrer les informations personnelles de l'utilisateur: nom et IP * / Nom de chaîne privée; chaîne privée ip; Utilisateur public (nom de chaîne, chaîne ip) {this.name = name; this.ip = ip; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public String getIP () {return ip; } public void setIP (String ip) {this.ip = ip; }}Server_more.java
import java.awt.borderlayout; import java.awt.color; import java.awt.gridlayout; import java.awt.toolkit; import java.awt.event.actionevent; import java.awt.event.actionListener; import java.awt.windowadapter; import java.awt.went.went; java.io.bufferedReader; import java.io.ioException; import java.io.inputStreamReader; import java.io.printwriter; import java.net.bindexception; import java.net.serversocket; javax.swing.defaultListmodel; import javax.swing.jbutton; importer javax.swing.jframe; import javax.swing.jlabel; importer javax.swing.jlist; import javax.swing.joptionpane; javax.swing.jsplitpane; import javax.swing.jtextarea; import javax.swing.jtextfield; import javax.swing.border.titledBorder; public class server_more {private jframe frame; JEXTAREA PRIVÉE ContentArea; // Field de texte privé jTextfield txt_Message; // Utilisé pour afficher des informations de texte privé JTextfield txt_max; // Définissez le nombre maximum de personnes connectées Jtextfield Private Txt_port; // Définir le numéro de port privé JButton BTN_START; // Bouton de démarrage privé jbutton btn_stop; // Bouton de déconnexion privé jbutton btn_send; // Envoyer un bouton privé Jpanel Northpanel; // JPANEL PRIVÉE-NORD JPANEL Southpanel; // South Panel Private Jscrollpane Rightpanel; // la barre de défilement gauche privée jscrollpane LeftPanel; // barre de défilement droit privé jsplitpane Centersplit; // la liste jlist privée de la ligne divisée; // un seul composant privé defaultListModel listModel; privé serversocket serversocket; ServerThread privé ServerThread; Clients Private ArrayList <SimitéThread>; Boolean privé isStart = false; // Méthode principale, entrée d'exécution de programme public static void main (String [] args) {new Server_more (); } // EXECUTER Message Send public void Send () {if (! IsStart) {joptionPane.showMessageDialog (trame, "Le serveur n'a pas encore commencé, et le message ne peut pas être envoyé!", "Erreur", joptionpane.error_message); retour; } if (clients.size () == 0) {jOptionPane.showMessageDialog (trame, "Aucun utilisateur n'est en ligne, les messages ne peuvent pas être envoyés!", "Error", joptionpane.error_message); retour; } String Message = txt_Message.getText (). Trim (); if (message == null || message.equals ("")) {joptionpane.showMessageDialog (cadre, "le message ne peut pas être vide!", "Error", joptionpane.error_message); retour; } SendServerMessage (message); // Message Message Message ContentArea.Apend ("Server:" + txt_Message.getText () + "/ r / n"); txt_message.setText (null); } // Construisez la méthode Drop public Server_more () {frame = new JFrame ("Server"); // modifie l'icône du jframe: //frame.seticonimage(toolkit.getdefaulttoolkit().CreateImage(client.class.getResource("qq.png "))); //frame.seticonimage(toolkit.getDefaultToolkit().CreateImage(server.class.getResource("qq.png ")))); contentArea = new JTextArea (); contentArea.SetEditable (false); contentArea.setForeground (Color.Blue); txt_message = new JTextField (); txt_max = new JTextField ("30"); txt_port = new JTextField ("6666"); btn_start = new Jbutton ("start"); btn_stop = new Jbutton ("stop"); btn_send = new JButton ("Send"); btn_stop.setEnabled (false); listModel = new defaultListModel (); userList = new JList (listModel); SouthPanel = New JPanel (New BorderLayout ()); SouthPanel.SetBorder (nouveau TitledBorder ("Message d'écriture")); SouthPanel.add (txt_message, "Centre"); SouthPanel.Add (BTN_SEND, "East"); LeftPanel = new JscrollPane (UserList); LeftPanel.SetBorder (new TitledBorder ("User en ligne")); RightPanel = new JscrollPane (contentArea); RightPanel.SetBorder (nouveau TitledBorder ("Zone d'affichage des messages")); Centersplit = new jsplitpane (jsplitpane.horizontal_split, LeftPanel, droite); Centersplit.SetdividerLocation (100); NorthPanel = New Jpanel (); NorthPanel.SetLayout (New GridLayout (1, 6)); NorthPanel.Add (New Jlabel ("Limite supérieure")); northpanel.add (txt_max); Northpanel.add (New Jlabel ("port")); northpanel.add (txt_port); Northpanel.add (btn_start); northpanel.add (btn_stop); NorthPanel.SetBorder (nouveau TitledBorder ("Informations de configuration")); frame.setLayout (new BorderLayout ()); frame.add (Northpanel, "North"); frame.add (Centersplit, "Center"); frame.add (Southpanel, "Sud"); frame.SetSize (600, 400); //frame.setsize(toolkit.getDefaultToolkit (). getScreensize ()); // Définir le plein écran int screen_width = toolkit.getDefaultToolkit (). GetScreensize (). Largeur; int screen_height = toolkit.getDefaultToolkit (). getScreenSize (). Hight; frame.setLocation ((screen_width - frame.getWidth ()) / 2, (screen_height - frame.getheight ()) / 2); frame.setVisible (true); // événement lors de la fermeture du cadre de fenêtre.addwindowListener (new WindowAdapter () {public void windowClosing (windowEvent e) {if (isStart) {closeServer (); // Fermer le serveur} system.exit (0); // programme de sortie}}); // Event txt_Message.AddActionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {send ();}}); // événement btn_send.addactionListener (new ActionListener () {public void ActionPerformed (actionEvent arg0) {send ();}}); // événement btn_start.addactionListener (new ActionListener () {public void ActionperFormed (ActionEvent e) {if (isStart) {joptionpane.showMessageDialog (trame, "le serveur est déjà dans l'état de démarrage, ne démarrez pas à bien des égards!", "Error", essais. Max = Integer.ParseInt (txt_max.getText ());} Catch (exception e1) {Throw } Catch (exception e1) {lancez une nouvelle exception ("le numéro de port est un entier positif!");} if (port <= 0) {lancez une nouvelle exception ("le numéro de port est un entier positif!");} ServertStart (MAX, port); JOptionPane.showMessageDialog (Frame, "Server a commencé avec succès!"); txt_max.setEnabled (false); txt_port.setEnabled (false); btn_stop.setEnabled (true); } catch (exception exc) {joptionpane.showMessageDialog (trame, excc.GentMessage (), "Error", joptionpane.error_message); }}}); // événement btn_stop.addactionListener (new ActionListener () {public void ActionperFormed (ActionEvent e) {if (! IsStart) {joptionPane.showMessageAriALOG (cadre, "le serveur n'a pas encore commencé, pas besoin d'arrêter!", "Error", joptionpane.error_mesage); rendement;} essayez {roseer "); btn_start.setenabled (true); JOptionPane.showMessageDialog (cadre, "Exception s'est produite lorsque le serveur est arrêté!", "Error", jOptionPane.Error_Message);}}); } // Démarrer le serveur public void ServerStart (int max, int port) lève java.net.bindexception {try {clients = new ArrayList <SimitéThread> (); SERVERSOCKET = NOUVEAU SERVERSOCKET (port); serverthread = new ServerThread (Serversocket, max); serverthread.start (); isStart = true; } catch (bindException e) {isStart = false; Jetez une nouvelle bindException ("Le numéro de port a été occupé, veuillez le changer!"); } catch (exception e1) {e1.printStackTrace (); isStart = false; lancer une nouvelle bindException ("Démarrer l'exception du serveur!"); }} // Fermez le serveur @SuppressWarnings ("Deprécation") public void closeServer () {try {if (serverthread! = Null) ServerThread.Stop (); // Arrête le thread du serveur pour (int i = clients.Size () - 1; i> = 0; i--) {// Envoyez la commande Close à tous les utilisateurs en ligne clients.get (i) .getWriter (). println ("close"); clients.get (i) .getWriter (). Flush (); // Libérez les ressources clients.get (i) .stop (); // Arrêtez ce thread en servant le client client.get (i) .reader.close (); clients.get (i) .writer.close (); clients.get (i) .socket.close (); CLIENTS.REMOVE (I); } if (serversocket! = null) {serversocket.close (); // Fermez la connexion côté serveur} listModel.RemoveAllelements (); // effacer la liste d'utilisateurs isStart = false; } catch (ioException e) {e.printStackTrace (); isStart = true; }} // Message de serveur en vrac public void SendServerMessage (Message de chaîne) {pour (int i = clients.size () - 1; i> = 0; i--) {clients.get (i) .getWriter (). Println ("server:" + message + "(multiple envoy)"); clients.get (i) .getWriter (). Flush (); }} // Le serveur classe Classe ServerThread étend Thread {private Serversocket SERVERSocket; private int max; // Nombre supérieur de personnes // Constructing Method of Server Thread Public ServerThread (SERVERSOCKET SERVERSocket, int max) {this.serversocket = serversocket; this.max = max; } public void run () {while (true) {// Continuez à attendre le lien client try {socket socket = serversocket.accept (); if (clients.size () == max) {// Si le nombre maximum de personnes a été atteint BuffereDReader R = new BufferedReader (new InputStreamReader (socket.getInputStream ())); Printwriter w = new printwriter (socket .getOutputStream ()); // reçoit des informations de base de l'utilisateur de la chaîne client inf = r.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); Utilisateur utilisateur = nouvel utilisateur (St.NextToken (), St.NextToken ()); // Informations de réussite de connexion à la connexion w.println ("max @ server: désolé," + user.getName () + user.getIp () + ", le nombre de personnes en ligne sur le serveur a atteint la limite supérieure, veuillez essayer de vous connecter plus tard!"); w.flush (); // Libérez la ressource r.close (); w.close (); socket.close (); continuer; } ClientThread Client = new ClientThread (socket); client.start (); // Démarrez les threads pour ce service client client.add (client); listModel.Addelement (client.getUser (). getName ()); // Mettez à jour la liste en ligne contenuaRea.append (client.getUser (). getName () + client.getUser (). getip () + "en ligne! / r / n"); } catch (ioException e) {e.printStackTrace (); }}}}} // Thread Servant une classe client ClientThread étend Thread {private socket socket; lecteur privé BufferedReader; écrivain privé de gravure; utilisateur utilisateur privé; public BufferedReader getReader () {return lecteur; } public Printwriter getWriter () {return writer; } public utilisateur getUser () {return utilisateur; } // Constructeur de filetage client public ClientThread (socket socket) {try {this.socket = socket; Reader = new BufferedReader (new InputStreamReader (socket .getInputStream ())); écrivain = new printwriter (socket.getOutputStream ()); // reçoit des informations utilisateur de base de la chaîne client inf = Reader.Readline (); StringTokenizer st = new StringTokenizer (inf, "@"); user = nouvel utilisateur (St.NextToken (), St.NextToken ()); // Feedback Connection Success Information Writer.println (user.getName () + user.getIp () + "Connectez-vous avec succès au serveur!"); écrivain.flush (); // Commentaires sur les informations utilisateur en ligne actuelles if (clients.size ()> 0) {String temp = ""; pour (int i = clients.size () - 1; i> = 0; i--) {temp + = (Clients.get (i) .GetUser (). getName () + "/" + Clients .get (i) .GetUser (). getip ()) + "@"; } writer.println ("utilisateur @" + clients.size () + "@" + temp); écrivain.flush (); } // Envoyez la commande utilisateur en ligne à tous les utilisateurs en ligne pour (int i = clients.size () - 1; i> = 0; i--) {clients.get (i) .getWriter (). Println ("add @" + user.getName () + user.getip ()); clients.get (i) .getWriter (). Flush (); }} catch (ioException e) {e.printStackTrace (); }} @SuppressWarnings ("Deprécation") public void run () {// reçoit en continu des messages du client pour le traitement. Message de chaîne = null; while (true) {try {message = reader.readline (); // reçoit des messages clients if (message.equals ("close")) // commande hors ligne {contentArea.append (this.getUser (). getName () + this.getuser (). getip () + "offline! / r / n"); // déconnecter et libérer les ressources Reader.close (); écrivain.close (); socket.close (); // Envoyez la commande hors ligne de l'utilisateur à tous les utilisateurs en ligne pour (int i = clients.size () - 1; i> = 0; i--) {clients.get (i) .getWriter (). Println ("delete @" + user.getName ()); clients.get (i) .getWriter (). Flush (); } listModel.RemoveElement (user.getName ()); // Mettez à jour la liste en ligne // Supprimer ce thread de service client pour (int i = clients.size () - 1; i> = 0; i--) {if (clients.get (i) .GetUser () == user) {clientThread Temp = client.get (i); Clients.Remove (i); // Supprimer le thread de service de cet utilisateur temp.stop (); // Arrête ce fil de service; }}} else {DispatmerMessage (message); // message avant}} catch (ioException e) {e.printStackTrace (); }}} // message avant public void DispatcherMessage (message de chaîne) {stringTokenizer stringTokenizer = new StringTokenizer (message, "@"); String Source = StringTokenizer.NextToken (); String propriétaire = StringTokenizer.NextToken (); String Content = StringTokenizer.NextToken (); message = source + ":" + contenu; contentArea.append (message + "/ r / n"); if (propriétaire.equals ("all")) {// bulk for (int i = clients.size () - 1; i> = 0; i--) {clients.get (i) .getWriter (). println (message + "(multiple envoy)"); clients.get (i) .getWriter (). Flush (); }}}}}}}Client_more.java
import java.awt.borderlayout; import java.awt.color; import java.awt.gridlayout; import java.awt.toolkit; import java.awt.event.actionevent; import java.awt.event.actionListener; import java.awt.windowadapter; import java.awt.went.went; java.io.bufferedReader; import java.io.ioException; import java.io.inputstreamreader; import java.io.printwriter; import java.net.socket; import java.util.hashmap; javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jlist; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jsplitpane; javax.swing.jTextArea; import javax.swing.jtextfield; import javax.swing.border.titledBorder; public class Client_more {cadre jframe privé; LLIST PRIVÉ JLIST UserList; JEXTAREA PRIVÉE TextArea; Jtexfield privé Textfield; privé jTextfield txt_port; privé jTextfield txt_hostip; JEXTFIELD PRIVÉ TXT_NAME; privé jbutton btn_start; privé jbutton btn_stop; privé jbutton btn_send; Jpanel privé Northpanel; Jpanel privé Southpanel; JSCROLL PRIVÉE REGARDSCROLL; JSCROLLPANE PRIVÉE LELTSCROLL; JSPLITPANE PRIVÉEPLIT; Private DefaultListModel ListModel; booléen privé isConned = false; prise à douille privée; écrivain privé de gravure; lecteur privé BufferedReader; MessageThread privé MessageThread; // le thread responsable de la réception de messages Private Map <String, User> OnlineUsers = new HashMap <String, User> (); // Tous les utilisateurs en ligne // Méthode principale, entrée de programme Public Static Void Main (String [] args) {new client_more (); } // Exécuter l'envoi publique void send () {if (! IsConned) {joptionpane.showMessageDialog (trame, "Le serveur n'y a pas encore été connecté, et le message ne peut pas être envoyé!", "Error", joptionpane.error_message); retour; } String message = textfield.getText (). Trim (); if (message == null || message.equals ("")) {joptionpane.showMessageDialog (cadre, "le message ne peut pas être vide!", "Error", joptionpane.error_message); retour; } sendMessage (frame.getTitle () + "@" + "all" + "@" + message); TextField.SeTText (null); } // Constructeur public client_more () {textArea = new JTextArea (); textArea.setEditable (false); textarea.setForeground (Color.Blue); TextField = new JTextField (); txt_port = new JTextField ("6666"); txt_hostip = new JTextField ("127.0.0.1"); txt_name = new JTextField ("wu chengqian"); btn_start = new JButton ("connexion"); btn_stop = new Jbutton ("déconnecter"); btn_send = new JButton ("Send"); listModel = new defaultListModel (); userList = new JList (listModel); NorthPanel = New Jpanel (); NorthPanel.SetLayout (New GridLayout (1, 7)); Northpanel.add (New Jlabel ("port")); northpanel.add (txt_port); northpanel.add (new JLabel ("Server IP")); northpanel.add (txt_hostip); Northpanel.add (New Jlabel ("nom")); northpanel.add (txt_name); Northpanel.add (btn_start); northpanel.add (btn_stop); NorthPanel.SetBorder (nouveau TitledBorder ("Informations de connexion")); RightsCroll = new JscrollPane (TextArea); RightsCroll.SetBorder (nouveau TitledBorder ("Zone d'affichage des messages")); LeftScroll = new JscrollPane (UserList); LeftScroll.SetBorder (nouveau TitledBorder ("User en ligne")); SouthPanel = New JPanel (New BorderLayout ()); Southpanel.add (Textfield, "Centre"); SouthPanel.Add (BTN_SEND, "East"); SouthPanel.SetBorder (nouveau TitledBorder ("Message d'écriture")); Centersplit = new jsplitpane (jsplitpane.horizontal_split, LeftScroll, droitscroll); Centersplit.SetdividerLocation (100); frame = new JFrame ("Client"); // modifie l'icône du jframe: // trame.seticonImage (Toolkit.getDefaultToolkit (). CreateImage (client.class.getResource ("qq.png"))); frame.setLayout (new BorderLayout ()); frame.add (Northpanel, "North"); frame.add (Centersplit, "Center"); frame.add (Southpanel, "Sud"); frame.SetSize (600, 400); int screen_width = toolkit.getDefaultToolkit (). getScreensize (). largeur; int screen_height = toolkit.getDefaultToolkit (). getScreenSize (). Hight; frame.setLocation ((screen_width - frame.getWidth ()) / 2, (screen_height - frame.getheight ()) / 2); frame.setVisible (true); // Événement lorsque vous appuyez sur Entrée dans la zone de texte pour écrire le message textfield.addactionListener (new ActionListener () {public void ActionperFormed (ActionEvent Arg0) {send ();}}); // événement btn_send.addactionListener (new ActionListener () {public void ActionPerformed (actionEvent e) {send ();}}); // événement btn_start.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {int port; if (isConned) {joptionpane.showMessagealialog (trame, "Il est déjà sur la connexion, ne répétez pas la connexion!", "Erreur" Integer.Parseint (txt_port.GetText (). hostip.equals ("") {lancez une nouvelle exception (nom du serveur ne peut pas être vide! "); JOptionPane.showMessageDialog (frame, excc.GentMessage (), "Error", jOptionPane.Error_Message);}}}); // événement btn_stop.addactionListener (new ActionListener () {public void ActionperFormed (ActionEvent e) {if (! IsConned) {joptionpane.showMessageDialog (trame, "Il est déjà dans un état déconnecté, ne déconnecte pas répéter!" CloseConnection (); // déconnecter si (Flag == false) {New Exception (Exception s'est produite lors de la déconnexion! "); }}}); // événement lors de la fermeture du cadre de fenêtre.addwindowListener (new WindowAdapter () {public void windowclosing (windowEvent e) {if (isConned) {closeConnection (); // Fermer la connexion} System.exit (0); // quitte le programme}}); } / ** * Connectez-vous au serveur * * @param port * @param hostip * @param name * / public boolean connectServer (int port, string hostip, string name) {// connecter au serveur try {socket = new socket (hostip, port); // établit une connexion basée sur le numéro de port et le serveur ip writer = new printwriter (sockett.getoutputStream ();); Reader = new BufferedReader (new InputStreamReader (socket .getInputStream ())); // Envoi des informations de base de l'utilisateur client (nom d'utilisateur et adresse IP) SendMessage (nom + "@" + socket.getLocalAddress (). ToString ()); // Ouvrez le thread pour recevoir des messages MessageThread = new MessageThread (Reader, TextArea); MessageThread.start (); IsConnedCed = true; // a été connecté pour retourner True; } catch (exception e) {textarea.append ("Le serveur avec numéro de port:" + port + "adresse IP:" + hostip + "a échoué!" + "/ r / n"); isConnedCected = false; // renvoie false sur non connecté; }} / ** * Envoyer le message * * @param message * / public void sendMessage (String Message) {writer.println (message); écrivain.flush (); } / ** * Le client ferme activement la connexion * / @SuppressWarnings ("Deprécation") public Synchronisé Boolean CloseConnection () {Try {sendMessage ("Close"); // Envoyer la commande de déconnexion au serveur MessageThread.stop (); // Stop Acceding Message Thread // Release Resource if (Reader! = Null) {lecteur. } if (writer! = null) {writer.close (); } if (socket! = null) {socket.close (); } isConnected = false; Retour Vrai; } catch (ioException e1) {e1.printStackTrace (); isConnected = true; retourne false; }} // Thread qui reçoit constamment des messages classe MessageThread étend Thread {lecteur privé BufferedReader; JEXTAREA PRIVÉE TextArea; // Construction de la méthode de réception du thread de message publique MessageThread (lecteur tampon deader, jTextArea textArea) {this.reader = lecteur; this.textArea = textArea; } // Fermez passivement la connexion publique synchronisée void closeCon () lève une exception {// effacer l'utilisateur listModel.RemoveAllements (); // Fermez passivement la connexion et relâchez la ressource if (Reader! = Null) {reader.close (); } if (writer! = null) {writer.close (); } if (socket! = null) {socket.close (); } isConnected = false; // modifie l'état pour déconnecter} public void run () {string message = ""; while (true) {try {message = reader.readline (); StringTokenizer StringTokenizer = new StringTokenizer (message, "/ @"); String Command = StringTokenizer.NextToken (); // Commande if (Command.equals ("Close")) // Server Closed Command {textarea.append ("Server closed! / R / n"); CloseCon (); // Fermez passivement le retour de la connexion; // Fin Thread} else if (Command.equals ("add")) {// Certains utilisateurs mettent à jour la chaîne de liste en ligne username = ""; String userip = ""; if ((username = stringTokenizer.NextToken ())! = null && (userIp = stringTokenizer.nextToken ())! = null) {user user = new User (userName, userip); onlineUsers.put (nom d'utilisateur, utilisateur); listModel.addelement (nom d'utilisateur); }} else if (Command.equals ("Delete")) {// Certains utilisateurs envergurent la liste en ligne String username = stringTokenizer.nextToken (); Utilisateur utilisateur = (utilisateur) onlineUsers.get (nom d'utilisateur); OnlineUsers.Remove (utilisateur); listModel.RemoveElement (nom d'utilisateur); } else if (Command.equals ("UserList")) {// Chargez la liste d'utilisateurs en ligne int size = Integer .ParseInt (StringTokenizer.NextToken ()); String username = null; String userIp = null; pour (int i = 0; i <size; i ++) {username = stringTokenizer.NextToken (); userIp = StringTokenizer.NextToken (); Utilisateur utilisateur = nouvel utilisateur (nom d'utilisateur, userIp); onlineUsers.put (nom d'utilisateur, utilisateur); listModel.addelement (nom d'utilisateur); }} else if (command.equals ("max")) {// Le nombre de personnes a atteint la limite supérieure textarea.append (stringTokenizer.nextToken () + stringTokenizer.nextToken () + "/ r / n"); CloseCon (); // Fermez passivement la connexion joptionpane.showMessageDialog (cadre, "Le tampon serveur est plein!", "Erreur", joptionpane.error_message); return; // fin thread} else {// Message normal textarea.append (message + "/ r / n"); }} catch (ioException e) {e.printStackTrace (); } catch (exception e) {e.printStackTrace (); }}}}}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.