Dado que necesito crear un diseño de cursos de red de computadora de red y no quiero hacer el cableado de red o la configuración del enrutador LAN, etc., finalmente decidí usar el socket para escribir una sala de chat LAN basada en Java:
Para obtener más información sobre el socket y la programación de redes, consulte mi otro artículo: Programación basada en Java Socket
El programa se basa en la estructura C/S, es decir, el modo de servidor cliente.
servidor:
La IP predeterminada es IP nativa
Ambas partes deben determinar un número de puerto para establecer el número máximo de personas conectadas. La interfaz se puede iniciar y cerrar para mostrar el usuario y el nombre en línea (esta unidad no se muestra aquí)
Cliente:
Necesita configurar manualmente la dirección IP del servidor (LAN)
Establezca manualmente el número de puerto e ingrese el nombre para conectar y desconectar la interfaz de ejecución del programa de la siguiente manera:
servidor:
Cliente:
Subiré el código específico al final.
Hay muchas deficiencias en el software, como:
No hay optimización de intersección con la base de datos: todos los usuarios se pueden almacenar en la base de datos, y los registros de chat también se pueden colocar en la base de datos. No se implementa la optimización de chat uno a uno: todavía hay muchas deficiencias en el método de redefinir el chat uno a uno. Si está interesado en ello, regrese y estudie lentamente.
Los siguientes son tres códigos para el programa:
User.java
Usuario de clase pública { / *** Clase de información del usuario* Se utiliza para registrar información personal del usuario: Nombre y Nombre de cadena IP* / privado; IP de cadena privada; Public User (String Name, String IP) {this.name = name; this.ip = ip; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public String getip () {return ip; } public void setip (string ip) {this.ip = ip; }}Server_more.java
import java.awt.bordayout; import java.awt.color; import java.awt.gridLayout; import java.awt.toolkit; import java.awt.event.accionEvent; import java.awt.event.actionListener; import java.awt.event.windowadapter; import java.awt.windowwevent; java.io.bufferedReader; import java.io.ioException; import java.io.inputstreamreader; import java.io.printwriter; import java.net.bindexception; import java.net.serversocket; import java.net.socket; import java.util.arraylist; importar java.utilililia javax.swing.defaultListModel; import 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; import javax.swing.jtextarea; import javax.swing.jtextfield; import javax.swing.border.titledborder; public class Server_more {private jframe marco; JTEXTAREA PRIVADA ContentArea; // campo de texto privado jtextfield txt_message; // utilizado para mostrar información de texto privado jtextfield txt_max; // Establecer el número máximo de personas conectadas privadas jtextfield txt_port; // establecer el número de puerto privado jButton btn_start; // Botón de inicio privado JButton btn_stop; // Botón Desconectar JButton privado BTN_SEND; // Enviar botón Privado Jpanel Northpanel; // Panel Norte Privado Jpanel Southpanel; // Panel sur privado JSCrollPane RightPanel; // barra de desplazamiento izquierdo JSCROLLPANE JSCROLLPANE; // Barra de desplazamiento derecho Jsplitpane Centersplit; // Línea dividida JLIST PRIVADA JLISTLISTS; // componente único privado defaultListModel listModel; Servidor de servidores privado Servidor de machos; Servidor privado de serverThread; Private ArrayList <ClientThread> clientes; booleano privado esstart = false; // Método principal, entrada de ejecución del programa public static void main (string [] args) {new Server_more (); } // Ejecutar mensaje Enviar public void send () {if (! IsStart) {joptionPane.showMessEdialog (marco, "El servidor aún no ha comenzado, y el mensaje no se puede enviar!", "Error", JOptionPane.error_Message); devolver; } if (clients.size () == 0) {joptionPane.showMessEdialog (marco, "ningún usuario está en línea, ¡no se pueden enviar mensajes!", "Error", joptionPane.error_message); devolver; } String Message = txt_message.gettext (). Trim (); if (message == null || Message.equals ("")) {joptionPane.showMessEdialog (marco, "Message no puede estar vacío!", "Error", jOptionPane.error_message); devolver; } sendSerververMessage (mensaje); // Mass de Mass Server ContentArea.append ("Server:" + txt_message.gettext () + "/r/n"); txt_message.settext (nulo); } // Construye el método de caída pública servidor_more () {frame = new jframe ("servidor"); // Cambie el icono de 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 (falso); ContentArea.setForeground (color.blue); txt_message = new JTextField (); txt_max = new JTextField ("30"); txt_port = new JTextfield ("6666"); btn_start = new JButton ("Inicio"); btn_stop = new JButton ("parar"); btn_send = new JButton ("Enviar"); btn_stop.setEnabled (falso); listModel = new DefaultListModel (); UserList = new JList (ListModel); Southpanel = new JPanel (new BorderLayout ()); SouthPanel.SetBorder (nuevo TitledBorder ("Mensaje de escritura")); Southpanel.add (txt_message, "centro"); Southpanel.add (btn_send, "este"); LeftPanel = new JScrollPane (UserList); LeftPanel.SetBorder (nuevo TitledBorder ("Usuario en línea")); rightPanel = new JSCrollPane (ContentArea); rightPanel.setBorder (nuevo titulado TitletBorder ("Área de visualización de mensajes")); Centersplit = new JSplitPane (jsplitpane.horizontal_split, LeftPanel, RightPanel); Centersplit.SetDividerLocation (100); northpanel = new JPanel (); northpanel.setLayout (nuevo GridLayout (1, 6)); northpanel.add (nuevo JLabel ("límite superior")); northpanel.add (txt_max); northpanel.add (new Jlabel ("puerto")); northpanel.add (txt_port); northpanel.add (btn_start); northpanel.add (btn_stop); northpanel.setBorder (nuevo TitledBorder ("Información de configuración")); Frame.setLayout (new BorderLayout ()); Frame.Add (NorthPanel, "Norte"); Frame.Add (Centersplit, "Center"); Frame.Add (Southpanel, "Sur"); Frame.setsize (600, 400); //frame.setsize(Toolkit.getDefaultToolkit (). GetsCreensize ()); // Establecer pantalla completa int Screen_width = Toolkit.getDefaultToolkit (). GetsCreensize (). Width; int Screen_height = Toolkit.getDefaultToolkit (). GetsCreensize (). HIED; Frame.setLocation ((screen_width - frame.getWidth ()) / 2, (screen_height - frame.getheight ()) / 2); Frame.SetVisible (verdadero); // Evento Al cerrar la ventana Frame.Addwindowlistener (new WindowsAdapter () {public void WindowClosing (WindowsEvent e) {if (isStart) {seareserver (); // cerrar el servidor} system.exit (0); // programa de salida}}); // evento txt_message.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {send ();}}); // evento btn_send.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent Arg0) {send ();}}); // evento btn_start.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {if (isStart) {jOptionPane.ShowMessageDialog (Frame, "El servidor ya está en el estado de inicio, no comience repetidamente!", "Error", jOptionPane.error_message); {max = Integer.ParseInt (txt_max.gettext ()); Integer.ParseInt (txt_port.gettext ()); puerto + "/r/n"); txt_max.setenable (falso); txt_port.setEnabled (falso); btn_stop.setEnabled (true); } catch (Exception exc) {jOptionPane.ShowMessEdialog (marco, exc.getMessage (), "Error", JoptionPane.error_Message); }}}); // evento btn_stop.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {if (! IsStart) {jOptionPane.showMessageDialog (frame, "el servidor aún no ha comenzado, no es necesario detener!", "Error", jOptionPane.error_message); regreso;} try} intit {CloseServer (); btn_start.setEnabled (true); JoptionPane.ShowMessEdialog (marco, "¡La excepción ocurrió cuando se detiene el servidor!", "Error", JoptionPane.error_message); } // Inicie el servidor public void serverstart (int max, int puerto) lanza java.net.bindexception {try {clientes = new ArrayList <ClientThread> (); Serversocket = nuevo Serversocket (puerto); ServerThread = nuevo ServerThread (Serversocket, Max); serverthread.start (); iSStart = True; } catch (BindException e) {isStart = false; arrojar una nueva bindException ("El número de puerto ha sido ocupado, por favor, cambíe!"); } catch (excepción e1) {e1.printstackTrace (); iSStart = false; arrojar una nueva bindException ("¡Inicie la excepción del servidor!"); }} // Cierre el servidor @SupplesSWarnings ("Deprecation") public void CloseServer () {try {if (serverThread! = Null) serverthread.stop (); // Detenga el hilo del servidor para (int i = clients.size ()-1; i> = 0; i--) {// Envía el comando cercano a todos los usuarios en línea clientes.get (i) .getWriter (). println ("cerrar"); clientes.get (i) .getWriter (). Flush (); // libera el recurso clientes.get (i) .stop (); // detener este hilo sirviendo al cliente. clientes.get (i) .writer.close (); clientes.get (i) .socket.close (); clientes.remove (i); } if (ServerSocket! = NULL) {SERVERSOCKE.CLOSE (); // Cerrar la conexión del lado del servidor} listModel.RemoveAlLelements (); // Borrar la lista de usuarios ISstart = false; } catch (ioException e) {E.PrintStackTrace (); iSStart = True; }} // Mensaje del servidor masivo public void sendSerververMessage (mensaje de cadena) {for (int i = clients.size ()-1; i> = 0; i--) {clientes.get (i) .getwriter (). Println ("servidor:" + mensaje + "(envío múltiple)"); clientes.get (i) .getWriter (). Flush (); }} // Servidor Thread Class ServerThread extiende el subproceso {privado Serversocket Serversocket; Private int max; // número superior de personas // Método de construcción del servidor de servidor Servidor PublicThread (ServerSocket Serversocket, int max) {this.SerVersocket = Serversocket; this.max = max; } public void run () {while (true) {// sigue esperando el enlace del cliente intenta {socket socket = serversocket.accept (); if (clientes.size () == max) {// Si se ha alcanzado el número máximo de personas BufferedReader r = new BufferedReader (new InputStreamReader (Socket.getInputStream ())); PrintWriter w = new PrintWriter (socket .getOutputStream ()); // recibir información básica del usuario de la cadena del cliente inf = r.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); Usuario user = nuevo usuario (St.NextToken (), St.NextToken ()); // Información de éxito de la conexión de retroalimentación w.println ("max@servidor: lo siento" + user.getName () + user.getip () + ", el número de personas en línea en el servidor ha alcanzado el límite superior, ¡intente conectarse más tarde!"); W.Flush (); // libera el recurso r.close (); w.close (); socket.close (); continuar; } ClientThread Client = New ClientThread (Socket); client.start (); // Inicie los subprocesos para este servicio de clientes clientes.Add (Cliente); listModel.addelement (Client.getuser (). getName ()); // Actualice la lista en línea ContentArea.append (Client.getuser (). getName () + client.getuser (). getip () + "en línea!/r/n"); } catch (ioException e) {E.PrintStackTrace (); }}}}} // hilo Sirviendo a una clase de cliente ClientThread extiende el subproceso {Socador de socket privado; lector privado de lector buffered; escritor de printwriter privado; Usuario privado de usuario; public BufferedReader getReader () {return Reader; } public PrintWriter getWriter () {return Writer; } Public User getUser () {return user; } // Constructor de Client Thread public ClientThread (Socket Socket) {try {this.socket = socket; lector = new BufferedReader (new InputStreamReader (Socket .getInputStream ())); escritor = new PrintWriter (Socket.getOutputStream ()); // recibir información básica del usuario de la cadena del cliente inf = lector.readline (); StringTokenizer st = new StringTokenizer (inf, "@"); usuario = nuevo usuario (St.NextToken (), St.NextToken ()); // Información de la conexión de retroalimentación Información de éxito Writer.println (user.getName () + user.getip () + "¡Conéctese al servidor correctamente!"); escritor.flush (); // Comentarios a la información actual del usuario en línea si (clientes.size ()> 0) {String temp = ""; for (int i = clients.size ()-1; i> = 0; i--) {temp + = (clientes.get (i) .getuser (). getName () + "/" + clientes .get (i) .getuser (). getip ()) + "@"; } escritor.println ("userlist@" + clients.size () + "@" + temp); escritor.flush (); } // Enviar el comando de usuario en línea a todos los usuarios en línea para (int i = clients.size ()-1; i> = 0; i--) {clientes.get (i) .getwriter (). Println ("agregar@" + user.getName () + user.getip ()); clientes.get (i) .getWriter (). Flush (); }} catch (ioException e) {E.PrintStackTrace (); }} @SupplesWarnings ("Deprecation") public void run () {// Recibe mensajes continuos del cliente para su procesamiento. Mensaje de cadena = nulo; while (true) {try {Message = Reader.Readline (); // Recibe mensajes del cliente if (mensaje.equals ("cerrar")) // comando sin conexión {contentarea.append (this.getuser (). getName () + this.getuser (). getip () + "Offline!/r/n"); // Desconectar y liberar recursos lector.close (); escritor.close (); socket.close (); // Envía el comando fuera de línea del usuario a todos los usuarios en línea para (int i = clients.size ()-1; i> = 0; i--) {clientes.get (i) .getwriter (). Println ("delete@" + user.getName ()); clientes.get (i) .getWriter (). Flush (); } listModel.removeElement (user.getName ()); // Actualice la lista en línea // Eliminar este hilo de servicio del cliente para (int i = clients.size ()-1; i> = 0; i--) {if (clientes.get (i) .getUser () == user) {ClientThread Temp = clientes.get (i); Clients.remove (i); // Eliminar el hilo de servicio de este usuario temp.stop (); // Detener este retorno de hilo de servicio; }}} else {Dispattermessage (mensaje); // reenviar mensaje}} catch (ioException e) {E.PrintStackTrace (); }}} // Reenviar mensaje public void Dispatchermessage (mensaje de cadena) {StringTokenizer StringTokenizer = new StringTokenizer (mensaje, "@"); String Source = StringTokenizer.NextToken (); String propietario = stringTokenizer.nextToken (); String content = stringTokenizer.nextToken (); mensaje = fuente + ":" + contenido; contentArea.append (mensaje + "/r/n"); if (propietario.equals ("all")) {// bulto para (int i = clients.size ()-1; i> = 0; i--) {clientes.get (i) .getwriter (). println (mensaje + "(múltiple envío)"); clientes.get (i) .getWriter (). Flush (); }}}}}}}Client_more.java
import java.awt.bordayout; import java.awt.color; import java.awt.gridLayout; import java.awt.toolkit; import java.awt.event.accionEvent; import java.awt.event.actionListener; import java.awt.event.windowadapter; import java.awt.windowwevent; java.io.bufferedReader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.socket; import java.util.hashmap; import java.util.map; import java.util.stringtenizer; 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; importar; importar; import javax.swing.jtexTarea; import javax.swing.jtextfield; import javax.swing.border.titledborder; public class Client_more {private jframe marco; Lista de usuario de Jlist privada; JTEXTAREA PRIVADA textaraa; Private JTextfield Textfield; privado jtextfield txt_port; privado jtextfield txt_hostip; privado jtextfield txt_name; privado jbutton btn_start; privado jbutton btn_stop; privado jbutton btn_send; Privado Jpanel Northpanel; Privado JPanel Southpanel; Privado JSCrollPane Rightscroll; Privado JSCrollPane Leftscroll; Jsplitpane Centersplit privado; privado defaultListModel listModel; Private Boolean ISconnected = false; enchufe privado; escritor de printwriter privado; lector privado de lector buffered; Private Messagethread Messagethread; // El hilo responsable de recibir mensajes Maps Private Map <String, User> OnlineUsers = new Hashmap <String, user> (); // Todos los usuarios en línea // Método principal, Entrada de programa Public static void main (string [] args) {new Client_more (); } // ejecutar enviando public void send () {if (! IsConnected) {jOptionPane.ShowMessEdialog (marco, "El servidor aún no se ha conectado a él, y el mensaje no se puede enviar!", "Error", joptionPane.error_message); devolver; } String Message = TextField.Gettext (). Trim (); if (message == null || Message.equals ("")) {joptionPane.showMessEdialog (marco, "Message no puede estar vacío!", "Error", jOptionPane.error_message); devolver; } sendMessage (frame.gettitle () + "@" + "todos" + "@" + mensaje); TextField.settext (nulo); } // constructor public client_more () {textAREA = new JTextArea (); textArea.setEditable (falso); 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 ("conexión"); btn_stop = new JButton ("desconectar"); btn_send = new JButton ("Enviar"); listModel = new DefaultListModel (); UserList = new JList (ListModel); northpanel = new JPanel (); northpanel.setLayout (nuevo GridLayout (1, 7)); northpanel.add (new Jlabel ("puerto")); northpanel.add (txt_port); northpanel.add (new JLabel ("IP del servidor")); northpanel.add (txt_hostip); northpanel.add (new Jlabel ("nombre")); northpanel.add (txt_name); northpanel.add (btn_start); northpanel.add (btn_stop); NorthPanel.SetBorder (nuevo TitledBorder ("Información de conexión")); RightsCroll = new JScrollPane (TextAea); RightsCroll.SetBorder (nuevo tituladoBorder ("Área de visualización de mensajes")); LeftScroll = new JScrollPane (UserList); LeftScroll.setBorder (nuevo TitledBorder ("Usuario en línea")); Southpanel = new JPanel (new BorderLayout ()); Southpanel.add (Textfield, "Centro"); Southpanel.add (btn_send, "este"); SouthPanel.SetBorder (nuevo TitledBorder ("Mensaje de escritura")); Centersplit = new JSplitPane (jsplitpane.horizontal_split, LeftScroll, RightsCroll); Centersplit.SetDividerLocation (100); frame = new Jframe ("Cliente"); // Cambie el icono de jFrame: // frame.SeticOnImage (Toolkit.getDefaultToolkit (). CreateImage (Client.class.getResource ("Qq.png"))); Frame.setLayout (new BorderLayout ()); Frame.Add (NorthPanel, "Norte"); Frame.Add (Centersplit, "Center"); Frame.Add (Southpanel, "Sur"); Frame.setsize (600, 400); int Screen_width = Toolkit.getDefaultToolkit (). GetsCreensize (). Width; int Screen_height = Toolkit.getDefaultToolkit (). GetsCreensize (). HIED; Frame.setLocation ((screen_width - frame.getWidth ()) / 2, (screen_height - frame.getheight ()) / 2); Frame.SetVisible (verdadero); // Evento al presionar Ingrese en el cuadro de texto para escribir el mensaje TextField.AdDactionListener (new ActionListener () {public void ActionPerformed (ActionEvent Arg0) {send ();}}); // Evento btn_send.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {send ();}}); // evento btn_start.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {int Port; if (IsConnected) {jOptionPane.ShowMessEdialog (Frame ", ya está en la conexión, no repita la conexión!", "Error", jOptionPane.error_message); return;} Integer.ParseInt (txt_port.gettext (). Trim ()); Hostip.equals ("") {tirar una nueva excepción ("¡El nombre y el servidor no se pueden vaciar!") JOptionPane.ShowMessEdialog (marco, exc.getMessage (), "Error", JoptionPane.error_message); // Evento btn_stop.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {if (! IsConnected) {joptionPane.showMessEdialog (frame ", ya está en un estado desconectado} ¡no disconente repetidamente!", "Error", JOptionPane.Error_message; Boolean Flag = CloseConnection (); // Desconecte if (flag == false) {throw New Exception ("¡Se produjo una excepción al desconectar!"); JoptionPane.error_message); // Evento Al cerrar el marco de la ventana. }/ ** * Conéctese al servidor * * @param puerto * @param hostip * @param name */ public boolean ConnectServer (int puerto, cadena hostip, name de cadena) {// Conectar al servidor try {Socket = new Socket (hostip, puerto); // Establecer una conexión basada en el número de puerto y el escritor IP del servidor = newWriter (Socket.getutputstream ()); lector = new BufferedReader (new InputStreamReader (Socket .getInputStream ())); // Enviar información básica del usuario del cliente (nombre de usuario y dirección IP) SendMessage (nombre + "@" + Socket.getLocalAddress (). ToString ()); // Abra el hilo para recibir mensajes Messagethread = new Messagethread (Reader, TextAREA); Messagethread.Start (); ISconnected = true; // se ha conectado para devolver verdadero; } Catch (Exception e) {TextAREA.Append ("El servidor con el número de puerto:" + Puerto + "Dirección IP:" + Hostip + "Falló!" + "/r/n"); IsConnected = false; // return false en no conectado; }} / ** * Enviar mensaje * * @param Mensaje * / public void sendMessage (mensaje de cadena) {escritor.println (mensaje); escritor.flush (); }/ *** El cliente cierra activamente la conexión*/ @suppleswarnings ("deprecation") public sincronizado boolean CloseConnection () {try {sendMessage ("Close"); // Enviar el comando DISCONNECT al comando del servidor Messagethread.stop (); // deja de aceptar mensajes de mensaje // liberar el recurso if (lector! = Null) {n. } if (escritor! = null) {writer.close (); } if (socket! = null) {socket.close (); } IsConnected = false; devolver verdadero; } catch (ioException e1) {e1.printstackTrace (); ISconnected = True; devolver falso; }} // hilo que recibe constantemente la clase Message Messagethread extiende el hilo {lector privado BufferedReader; JTEXTAREA PRIVADA textaraa; // Método de construcción para recibir el hilo de mensaje public Messagethread (BufferedReader Reader, JTexTarea TextARea) {this.reader = lector; this.texTarea = textAREA; } // Cierre pasivamente la conexión public sincronizada sincronizada Closecon () lanza la excepción {// Borrar el usuario listModel.removeAllelements (); // Cierre pasivamente la conexión y suelte el recurso if (Reader! = NULL) {Reader.Close (); } if (escritor! = null) {writer.close (); } if (socket! = null) {socket.close (); } IsConnected = false; // Modifique el estado para desconectar} public void run () {String Message = ""; while (true) {try {Message = Reader.Readline (); StringTokenizer stringTokenizer = new StringTokenizer (mensaje, "/@"); String command = stringTokenizer.nextToken (); // command if (command.equals ("cerrar")) // comando cerrado del servidor {textARea.append ("servidor cerrado!/R/n"); Closecon (); // cierre pasivamente el retorno de conexión; // end hilo} else if (command.equals ("add")) {// Algunos usuarios están actualizando la lista en línea String username = ""; String userip = ""; if ((username = stringTokenizer.NextToken ())! = NULL && (userIP = stringTokenizer.nextToken ())! = NULL) {User User = New User (UserName, UserIP); onlineUsers.put (nombre de usuario, usuario); listModel.addelement (nombre de usuario); }} else if (command.equals ("delete")) {// Algunos usuarios están bajando la lista en línea String UserName = StringTokenizer.NextToken (); Usuario user = (usuario) onlineusers.get (nombre de usuario); onlineUsers.remove (usuario); listModel.RemoveElement (nombre de usuario); } else if (command.equals ("UserList")) {// Cargue la lista de usuarios en línea int size = Integer .ParseInt (stringTokenizer.nextToken ()); String USERNAME = NULL; String userip = null; for (int i = 0; i <size; i ++) {username = stringTokenizer.nextToken (); userIP = stringTokenizer.nextToken (); Usuario user = nuevo usuario (nombre de usuario, userip); onlineUsers.put (nombre de usuario, usuario); listModel.addelement (nombre de usuario); }} else if (command.equals ("max")) {// El número de personas ha alcanzado el límite superior textarea.append (stringTokenizer.nextToken () + stringTokenizer.nextToken () + "/r/n"); Closecon (); // Cerrar pasivamente la conexión JOpttionPane.ShowMessEdialog (marco, "¡El búfer del servidor está lleno!", "Error", jOptionPane.error_message); return; // end hilo} else {// mensaje normal textarea.append (mensaje + "/r/n"); }} catch (ioException e) {E.PrintStackTrace (); } catch (Exception e) {E.PrintStackTrace (); }}}}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.