Вы находитесь на странице: 1из 10

001import java.io.*; 002import java.net.*; import java.awt.*; 003import java.awt.event.*; 004import javax.swing.

*; 005public class Servidor extends JFrame { 006private JTextField campoIntroducir; 007private JTextArea areaPantalla; private ObjectOutputStream salida; 008private ObjectInputStream entrada; 009private ServerSocket servidor; 010private Socket conexion; 011private int contador = 1; // configurar GUI 012public Servidor() 013{ 014super( "Servidor" ); 015Container contenedor = getContentPane(); 016// crear campoIntroducir y registrar componente de escucha campoIntroducir = new JTextField(); 017campoIntroducir.setEditable( false ); 018campoIntroducir.addActionListener( 019new ActionListener() { 020// enviar mensaje al cliente 021public void actionPerformed( ActionEvent evento ) { 022enviarDatos( evento.getActionCommand() ); 023campoIntroducir.setText( "" ); 024} 025} 026); contenedor.add( campoIntroducir, BorderLayout.NORTH ); 027// crear areaPantalla 028areaPantalla = new JTextArea(); 029contenedor.add( new JScrollPane( areaPantalla ), 030BorderLayout.CENTER ); setSize( 300, 150 ); 031setVisible( true ); 032} // fin del constructor de Servidor 033// configurar y ejecutar el servidor 034public void ejecutarServidor() 035{ configurar servidor para que reciba conexiones; procesar las // 036conexiones 037try { 038// Paso 1: crear un objeto ServerSocket. 039servidor = new ServerSocket( 12345, 100 ); while ( true ) { 040try { 041esperarConexion(); // Paso 2: esperar una conexin. 042obtenerFlujos(); // Paso 3: obtener flujos de entrada y salida. 043procesarConexion(); // Paso 4: procesar la conexin. 044} // procesar excepcin EOFException cuando el cliente cierre la 045conexin 046catch ( EOFException excepcionEOF ) { 047System.err.println( "El servidor termin la conexin" );

048} 049finally { cerrarConexion(); // Paso 5: cerrar la conexin. 050++contador; 051} 052} // fin de instruccin while 053} // fin del bloque try 054// procesar problemas con E/S catch ( IOException excepcionES ) { 055excepcionES.printStackTrace(); 056} 057} // fin del mtodo ejecutarServidor 058// esperar que la conexin llegue, despus mostrar informacin de la 059conexin private void esperarConexion() throws IOException 060{ 061mostrarMensaje( "Esperando una conexin\n" ); 062conexion = servidor.accept(); // permitir al servidor aceptar la 063conexin " 064mostrarMensaje( "Conexin " + contador + ); recibida de: " + conexion.getInetAddress().getHostName() 065} 066// obtener flujos para enviar y recibir datos 067private void obtenerFlujos() throws IOException 068{ // establecer flujo de salida para los objetos 069salida = new ObjectOutputStream( conexion.getOutputStream() ); 070salida.flush(); // vaciar bfer de salida para enviar informacin de 071encabezado 072// establecer flujo de entrada para los objetos 073entrada = new ObjectInputStream( conexion.getInputStream() ); mostrarMensaje( "\nSe recibieron los flujos de E/S\n" ); 074} 075// procesar la conexin con el cliente 076private void procesarConexion() throws IOException 077{ de conexin exitosa 078// enviar mensaje"Conexin exitosa"; al cliente String mensaje = 079enviarDatos( mensaje ); 080// habilitar campoIntroducir para que el usuario del servidor pueda 081enviar mensajes 082establecerCampoTextoEditable( true ); 083do { // procesar los mensajes enviados por el cliente // leer el mensaje y mostrarlo en pantalla 084try { 085mensaje = ( String ) entrada.readObject(); 086mostrarMensaje( "\n" + mensaje ); 087} // atrapar problemas que pueden ocurrir al tratar de leer del cliente 088catch ( ClassNotFoundException excepcionClaseNoEncontrada ) { 089mostrarMensaje( "\nSe recibi un tipo de objeto desconocido" ); 090} 091} while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) ); procesarConexion 092} // fin del mtodosocket // cerrar flujos y 093private void cerrarConexion() 094{

095mostrarMensaje( "\nFinalizando la conexin\n" ); 096establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir try { 097salida.close(); 098entrada.close(); 099conexion.close(); 100} 101catch( IOException excepcionES ) { excepcionES.printStackTrace(); 102} 103} 104// enviar mensaje al cliente 105private void enviarDatos( String mensaje ) { 106// enviar objeto al cliente 107try { 108salida.writeObject( "SERVIDOR>>> " + mensaje ); 109salida.flush(); 110mostrarMensaje( "\nSERVIDOR>>> " + mensaje ); } 111// procesar problemas que pueden ocurrir al enviar el objeto 112catch ( IOException excepcionES ) { 113areaPantalla.append( "\nError al escribir objeto" ); 114} 115} mtodo utilitario que es llamado desde otros subprocesos para // 116manipular a 117// areaPantalla en el subproceso despachador de eventos 118private void mostrarMensaje( final String mensajeAMostrar ) 119{ // mostrar mensaje del subproceso de ejecucin despachador de eventos 120SwingUtilities.invokeLater( 121new Runnable() { // clase interna para asegurar que la GUI se actualice 122apropiadamente 123public void run() // actualiza areaPantalla 124{ areaPantalla.append( mensajeAMostrar ); 125areaPantalla.setCaretPosition( 126areaPantalla.getText().length() ); 127} 128} // fin de la clase interna 129); // fin de la llamada a SwingUtilities.invokeLater } 130// mtodo utilitario que es llamado desde otros subprocesos para 131manipular a 132// campoIntroducir en el subproceso despachador de eventos 133private void establecerCampoTextoEditable( final boolean editable ) { 134// mostrar mensaje del subproceso de ejecucin despachador de eventos 135SwingUtilities.invokeLater( 136new Runnable() { // clase interna para asegurar que la GUI se actualice 137apropiadamente 138public void run() // establece la capacidad de modificar a campoIntroducir 139{ 140campoIntroducir.setEditable( editable ); 141}

142} // fin de la clase interna 143); // fin de la llamada a SwingUtilities.invokeLater } 144public static void main( String args[] ) 145{ 146JFrame.setDefaultLookAndFeelDecorated(true); 147Servidor aplicacion = new Servidor(); 148aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); aplicacion.ejecutarServidor(); 149} 150} // fin de la clase Servidor 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 El cdigo fuente de Cliente.java: ? 001import java.io.*; 002import java.net.*; import java.awt.*; 003import java.awt.event.*; 004import javax.swing.*; 005public class Cliente extends JFrame { 006private JTextField campoIntroducir; 007private JTextArea areaPantalla; private ObjectOutputStream salida; 008private ObjectInputStream entrada; 009private String mensaje = ""; 010private String servidorChat; 011private Socket cliente; y 012// inicializar servidorChat ) configurar GUI public Cliente( String host 013{ 014super( "Cliente" ); 015servidorChat = host; // establecer el servidor al que se va a conectar

016este cliente 017Container contenedor = getContentPane(); // crear campoIntroducir y registrar componente de escucha 018campoIntroducir = new JTextField(); 019campoIntroducir.setEditable( false ); 020campoIntroducir.addActionListener( 021new ActionListener() { 022// enviar mensaje al servidor public void actionPerformed( ActionEvent evento ) 023{ 024enviarDatos( evento.getActionCommand() ); 025campoIntroducir.setText( "" ); 026} } 027); 028contenedor.add( campoIntroducir, BorderLayout.NORTH ); 029// crear areaPantalla 030areaPantalla = new JTextArea(); 031contenedor.add( new JScrollPane( areaPantalla ), BorderLayout.CENTER ); 032setSize( 300, 150 ); 033setVisible( true ); 034} // fin del constructor de Cliente 035// conectarse al servidor y procesar mensajes del servidor private void ejecutarCliente() 036{ 037// conectarse al servidor, obtener flujos, procesar la conexin 038try { 039conectarAServidor(); // Paso 1: crear un socket para realizar la 040conexin obtenerFlujos(); // Paso 2: obtener los flujos de entrada y salida 041procesarConexion(); // Paso 3: procesar la conexin 042} 043// el servidor cerr la conexin 044catch ( EOFException excepcionEOF ) { 045System.err.println( "El cliente termino la conexin" ); } 046// procesar los problemas que pueden ocurrir al comunicarse con el 047servidor 048catch ( IOException excepcionES ) { 049excepcionES.printStackTrace(); } 050finally { 051cerrarConexion(); // Paso 4: cerrar la conexin 052} 053} // fin del mtodo ejecutarCliente 054// conectarse al servidor private void conectarAServidor() throws IOException 055{ 056mostrarMensaje( "Intentando realizar conexin\n" ); 057// crear Socket para realizar la conexin con el servidor 058cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 ); // mostrar la informacin de la conexin 059mostrarMensaje( "Conectado a: " + 060cliente.getInetAddress().getHostName() ); 061} 062// obtener flujos para enviar y recibir datos

063private void obtenerFlujos() throws IOException 064{ // establecer flujo de salida para los objetos 065salida = new ObjectOutputStream( cliente.getOutputStream() ); 066salida.flush(); // vacar bfer de salida para enviar informacin de 067encabezado 068// establecer flujo de entrada para los objetos 069entrada = new ObjectInputStream( cliente.getInputStream() ); mostrarMensaje( "\nSe recibieron los flujos de E/S\n" ); 070} 071// procesar la conexin con el servidor 072private void procesarConexion() throws IOException 073{ // habilitar campoIntroducir para que el usuario del cliente pueda 074enviar mensajes 075establecerCampoTextoEditable( true ); 076do { // procesar mensajes enviados del servidor 077// leer mensaje y mostrarlo en pantalla 078try { mensaje = ( String ) entrada.readObject(); 079mostrarMensaje( "\n" + mensaje ); 080} 081// atrapar los problemas que pueden ocurrir al leer del servidor 082catch ( ClassNotFoundException excepcionClaseNoEncontrada ) { mostrarMensaje( "\nSe recibi un objeto de tipo desconocido" ); 083} 084} while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) ); 085} // fin del mtodo procesarConexion 086// cerrar flujos y socket 087private void cerrarConexion() { 088mostrarMensaje( "\nCerrando conexin" ); 089establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir 090try { 091salida.close(); 092entrada.close(); cliente.close(); 093} 094catch( IOException excepcionES ) { 095excepcionES.printStackTrace(); 096} } 097// enviar mensaje al servidor 098private void enviarDatos( String mensaje ) 099{ 100// enviar objeto al servidor 101try { salida.writeObject( "CLIENTE>>> " + mensaje ); 102salida.flush(); 103mostrarMensaje( "\nCLIENTE>>> " + mensaje ); 104} 105// procesar los problemas que pueden ocurrir al enviar el objeto catch ( IOException excepcionES ) { 106areaPantalla.append( "\nError al escribir el objeto" ); 107} 108} 109// mtodo utilitario que es llamado desde otros subprocesos para

110manipular a 111// areaPantalla en el subproceso despachador de eventos private void mostrarMensaje( final String mensajeAMostrar ) 112{ 113// mostrar mensaje del subproceso de ejecucin de la GUI 114SwingUtilities.invokeLater( 115new Runnable() { // clase interna para asegurar que la GUI se actualice 116apropiadamente public void run() // actualiza areaPantalla 117{ 118areaPantalla.append( mensajeAMostrar ); 119areaPantalla.setCaretPosition( 120areaPantalla.getText().length() ); } 121} // fin de la clase interna 122); // fin de la llamada a SwingUtilities.invokeLater 123} 124// mtodo utilitario que es llamado desde otros subprocesos para 125manipular a // campoIntroducir en el subproceso despachador de eventos 126private void establecerCampoTextoEditable( final boolean editable ) 127{ 128// mostrar mensaje del subproceso de ejecucin de la GUI 129SwingUtilities.invokeLater( new Runnable() { // clase interna para asegurar que la GUI se actualice 130apropiadamente 131public void run() // establece la capacidad de modificar 132campoIntroducir 133{ 134campoIntroducir.setEditable( editable ); } 135} // fin de la clase interna 136); // fin de la llamada a SwingUtilities.invokeLater 137} 138public static void main( String args[] ) 139{ JFrame.setDefaultLookAndFeelDecorated(true); 140Cliente aplicacion; 141if ( args.length == 0 ) 142aplicacion = new Cliente( "127.0.0.1" ); 143else aplicacion = new Cliente( args[ 0 ] ); 144aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 145aplicacion.ejecutarCliente(); 146} 147} // fin de la clase Cliente 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

Вам также может понравиться