Los ejemplos en este artículo comparten el código de sala de chat Java para su referencia. El contenido específico es el siguiente
Principalmente involucrado en el conocimiento
・ Redacción de programas de GUI en Java, incluido el mecanismo de escucha de eventos.
・ Uso de la programación de comunicación de red Java, SerververSocket y Socket Classes.
・ Programación múltiple, clase de subprocesos e interfaz ejecutable en Java.
código fuente
Cliente
PAQUETE PROYECTO1; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; Cliente de clase pública {JFRAME privado Clientframe; Privado Jlabel Iplabel; Privado Jlabel Portlabel; privado Jlabel Sayslabel; Privado Jlabel Nicknamelabel; Private JTextfield IpText; Private JTextfield Porttext; Private JTextfield Nicknamettext; privado jtextfield saystext; Privado JButton ConnectButton; Privado JButton NicknameButton; Privado JButton dice Button; privado Jpanel Jpanelnorth; Jpanel privado JPanelsouth0; Privado JPanel JPanelsouth1; Jpanel privado JPanelsouth2; JTEXTAREA PRIVADO CLIENTEXTAREA; Scroller privado JSCrollPane; lector privado de lector buffered; escritor de printwriter privado; apodo de cadena privada; public static void main (string args []) {Client aclient = new Client (); aclient.startup (); } // Inicializar el componente public Client () {Nickname = "Client"; ClientFrame = new JFrame (); jpanelnorth = new JPanel (); IPlabel = new JLabel ("IP del servidor", jlabel.left); IpText = new JTextfield (10); Portlabel = new JLabel ("Puerto de servidor", jlabel.left); Porttext = new JTextfield (10); ConnectButton = new JButton ("Conexión"); ClientTextArea = new JTextArea (); scroller = new JSCrollPane (ClientTextArea); jpanelsouth0 = new JPanel (); jpanelsouth1 = new JPanel (); jPanelSouth2 = new JPanel (); nicknamelabel = new JLabel ("Niparo", jlabel.left); NicknamEtext = new JTextfield (apodo, 30); NicknameButton = new JButton ("Confirmar"); saylabel = new JLabel ("Mensaje", jlabel.left); sayText = new JTextfield (30); SayButton = new JButton ("Confirmar"); } // construir gui private void buildGui () {// Configuración de la ventana ClientFrame.settitle ("Cliente"); ClientFrame.SetDefaultCloseOperation (jframe.exit_on_close); ClientFrame.SetSize (550, 550); // componente jpanelnorth.add (iPlabel); jpanelnorth.add (ipText); jpanelnorth.add (Portlabel); jpanelnorth.add (PortText); jpanelnorth.add (ConnectButton); ClientFrame.getContentPane (). ADD (BorderLayout.north, JPanelnorth); // El componente intermedio ClientTexTarea.SetFocusable (False); scroller.setVerTicalScrollBarPolicy (scrollPaneconstants.vertical_scrollbar_always); scroller.sethorizontalscrollBarpolicy (scrollpaneconstants.horizontal_scrollbar_never); ClientFrame.getContentPane (). Add (BorderLayout.Center, Scroller); // componentes del área sur jpanelsouth1.add (Nicknamelabel); jpanelsouth1.add (nicknametext); jpanelsouth1.add (NicknameButton); jpanelsouth2.add (Saylabel); jpanelsouth2.add (sayText); jpanelsouth2.add (Saybutton); jpanelsouth0.setLayout (nuevo BoxLayout (jpanelsouth0, boxLayout.y_axis)); jpanelsouth0.add (jpanelsouth1); jpanelsouth0.add (jpanelsouth2); ClientFrame.getContentPane (). ADD (BorderLayout.South, JPanelsouth0); // Establecer la ventana para ver ClientFrame.SetVisible (true); } // El cliente ejecuta public void startup () {buildGui (); // El hilo que recibe mensajes del servidor runnable incomingReader = new runnable () {@Override public void run () {string mensaje; Pruebe {while ((mensaje = lector.readline ())! = NULL) {ClientTextArea.Append (Message + "/n"); }} capt (excepción ex) {ex.printstackTrace (); }}}}; // Escuche el botón Connect para realizar la conexión del servidor ConnectButton.addactionListener (new ActionListener () {@Override public Void ActionPerformed (ActionEvent E) {String aserverip = iPtext.getText (); String aserverPort = portText.getText (); if (aserverIP.equals (") || aserverport. (") JoptionPane.ShowMessEdialog (ClientFrame, "Ingrese el IP y el puerto completo!"); BufferedReader (StreamReader); La entrada del puerto es correcta. ");}}}}}); // Escuche el apodo y establezca el apodo ActionListener NicknamElstener = new ActionListener () {@Override public Void ActionPerformed (ActionEvent E) {String atext = Nicknametext.gettext (); if (! Atext.equals ("")) {Nickname = atext; }}}}; NicknameButton.AddactionListener (Nicknamelistener); Nicknametext.AddactionListener (Nicknamelistener); NickNamEtext.AddfocusListener (new FocusListener () {@Override public void FocusGained (focuseVent e) {} @Override public void FocusLost (focuseVent e) {String atext = nicknametext.gettext (); if (! atext.equals ("")) {nickname = atext;}}}}); // Enviar un mensaje al servidor ActionListener sayListener = new ActionListener () {@Override public Void ActionPerformed (ActionEvent E) {String atext = sayText.gettext (); if (atext.equals ("")) {joptionPane.showMessEdialog (ClientFrame, "¡El contenido no puede estar vacío!"); } else {try {writer.println (Nickname + ":" + atext); escritor.flush (); } catch (Exception Ex) {Ex.PrintStackTrace (); } sayText.setText (""); }}}}; SayButton.AddactionListener (SayListener); sayText.AddactionListener (SayListener); }} servidor
PAQUETE PROYECTO1; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.arrayList; import java.util.iterator; import javax.swing.*; Public Class Server {private Jframe ServerFrame; Privado Jlabel Portlabel; privado Jlabel Sayslabel; Privado Jlabel Nicknamelabel; Private JTextfield Porttext; privado jtextfield saystext; Private JTextfield Nicknamettext; Privado JButton StartButton; Privado JButton dice Button; Privado JButton NicknameButton; privado Jpanel Jpanelnorth; Jpanel privado JPanelsouth0; Privado JPanel JPanelsouth1; Jpanel privado JPanelsouth2; Scroller privado JSCrollPane; JTEXTAREA PRIVADO SERVERTEXTAREA; Private ArrayList <PrintWriter> ClientOutputStreams; apodo de cadena privada; public static void main (string [] args) {servidor aserver = new Server (); aserver.startup (); } // Inicializar el componente público servidor () {Nickname = "Server"; serverframe = new JFrame (); jpanelnorth = new JPanel (); Portlabel = new JLabel ("Port", jlabel.left); Porttext = new JTextfield (30); startButton = new JButton ("Inicio"); serverTextArea = new JTextArea (); scroller = new JSCrollPane (ServerTextArea); nicknamelabel = new JLabel ("Niparo", jlabel.left); NicknamEtext = new JTextfield (apodo, 30); NicknameButton = new JButton ("Confirmar"); jpanelsouth0 = new JPanel (); jpanelsouth1 = new JPanel (); jPanelSouth2 = new JPanel (); saylabel = new JLabel ("Mensaje", jlabel.left); sayText = new JTextfield (30); SayButton = new JButton ("Confirmar"); } // construir GUI private void buildGui () {// Configuración de la ventana servidorframe.settitle ("servidor"); serverframe.setDefaultCloseOperation (jframe.exit_on_close); serverframe.setsize (550, 550); // componentes del área norte jpanelnorth.add (Portlabel); jpanelnorth.add (PortText); jpanelnorth.add (StartButton); serverframe.getContentPane (). add (borderLayout.north, jpanelnorth); // El componente intermedio ServerTexTarea.SetFocusable (False); scroller.setVerTicalScrollBarPolicy (scrollPaneconstants.vertical_scrollbar_always); scroller.sethorizontalscrollBarpolicy (scrollpaneconstants.horizontal_scrollbar_never); serverframe.getContentPane (). add (borderLayout.center, scroller); // componentes del Distrito Sur JPanelsouth1.Add (Nicknamelabel); jpanelsouth1.add (nicknametext); jpanelsouth1.add (NicknameButton); jpanelsouth2.add (Saylabel); jpanelsouth2.add (sayText); jpanelsouth2.add (Saybutton); jpanelsouth0.setLayout (nuevo BoxLayout (jpanelsouth0, boxLayout.y_axis); jpanelsouth0.add (jpanelsouth1); jpanelsouth0.add (jpanelsouth2); serverframe.getContentPane (). Ado. } // El servidor ejecuta public void startup () {buildGui (); {JoptionPane.ShowMessEdialog (ServerFrame, ingrese el número de puerto correcto! "); para la conexión del cliente .../n "); while (true) {socket clientsocket = serversocket.accept (); serverTextArea.Append ("Cliente conectado .../n"); PrintWriter Writer = new PrintWriter (Clientsocket.getOutputStream ()); ClientOutputStreams.add (escritor); Hilo t = nuevo subproceso (nuevo ClientHandler (ClientSocket)); t.Start (); }} Catch (NumberFormateException | ioException e) {E.PrintStackTrace (); }}}}; Thread serverThread = new Thread (ServerRunnable); serverthread.start (); } catch (Exception Ex) {Ex.PrintStackTrace (); }}}}}; startButton.addactionListener (startListener); PortText.AdDactionListener (startListener); // Escuche el apodo y establezca el apodo ActionListener NicknamElstener = new ActionListener () {@Override public Void ActionPerformed (ActionEvent E) {String atext = Nicknametext.gettext (); if (! Atext.equals ("")) {Nickname = atext; }}}; NicknameButton.AddactionListener (Nicknamelistener); Nicknametext.AddactionListener (Nicknamelistener); NickNamEtext.AddfocusListener (new FocusListener () {@Override public void FocusGained (focuseVent e) {} @Override public void FocusLost (focuseVent e) {String atext = nicknametext.gettext (); if (! atext.equals ("")) {nickname = atext;}}}}); // Escuche el botón Say y envíe un mensaje ActionListener sayListener = new ActionListener () {@Override public Void ActionPerformed (ActionEvent E) {String atext = saytext.gettext (); if (! atext.equals ("")) {atext = Nickname + ":" + atext; sendToeveryClient (atext); serverTextArea.Append (atext + "/n"); sayText.settext (""); } else {joptionPane.showMessEdialog (ServerFrame, "¡El contenido no puede estar vacío!"); }}}}; SayButton.AddactionListener (SayListener); sayText.AddactionListener (SayListener); } // hilo multi-client de clase pública ClientHandler implementa Runnable {BufferedReader Breader; Enchufe asocket; Public ClientHandler (Socket Clientsocket) {try {asocket = clientSocket; InputStreamReader isReader = new InputStreamReader (asocket.getInputStream ()); Breader = new BufferedReader (isReader); } catch (Exception Ex) {Ex.PrintStackTrace (); }} @Override public void run () {Mensaje de cadena; intente {while ((mensaje = panreer.readline ())! = null) {sendToeVersyClient (mensaje); serverTextArea.append (mensaje + "/n"); }} capt (excepción ex) {ex.printstackTrace (); }}} // método para enviar mensajes a todos los clientes vacío privado sendtoeveryClient (mensaje de cadena) {iterator <Printwriter> it = clientOutputStreams.Iterator (); while (it.hasnext ()) {try {printWriter escritor = (printwriter) it.next (); escritor.println (mensaje); escritor.flush (); } catch (Exception Ex) {Ex.PrintStackTrace (); }}}}GUI Running Captura de pantalla:
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.