Sunteți pe pagina 1din 16

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

gentoo linux, java, software libre y otras hierbas $HOME casidiablo.tv Autor Contribuir Java C# y .NET

Sgueme...

casidiablo.net
Me gusta 1,324

casidiablo.net en Facebook

Contacto

Lo que leo
Be Linux My Friend Bloguear por bloguear
1 de 16 10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

Casidiablo Media Descarga Juegos El Blog de Guapacho Linux Hispano LuAuF Nierox Pllate un Linux Programacin PHP Java y C++ , Programando Ideas Rincn Informtico rm -rf Que es un ensayo?

Publicidad

mar, 28 2008 - 11:53 am

[cdigo] Conexiones Cliente-Servidor mediante sockets en Java

tweets Por falta de tiempo me es imposible explicar este cdigo detalladamente, tal retweet como me gustara, pero no tengo otra opcin que simplemente ponerlo. An as es de recordar que pueden dejar todos los comentarios que deseen, con sus dudas y sugerencias (que no pedidos de tareas).

An as explico un poco el resultado del programa el programa es un chat simple (muy simple), que usa Sockets para crear conexiones de red. Consta de un servidor (Servidor.java) y un cliente (Cliente.java), mediante los cuales se puede establecer una conversacin. Si se escribe TERMINAR (sin comillas), la conexin se cierra.

2 de 16

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

El resultado

El cdigo
El cdigo fuente de Servidor.java: 001 002 003 004 005 006
3 de 16

import import import import import

java.io.*; java.net.*; java.awt.*; java.awt.<span class="IL_AD" id="IL_AD8">event</span>.*; javax.swing.*;

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062
4 de 16

<span class="IL_AD" id="IL_AD12">public</span> class Servidor extends private JTextField campoIntroducir; private JTextArea areaPantalla; private ObjectOutputStream salida; private ObjectInputStream entrada; private ServerSocket servidor; private Socket conexion; private int contador = 1; // configurar GUI public Servidor() { super( "Servidor" ); Container contenedor = getContentPane();

// crear campoIntroducir y <span class="IL_AD" id="IL_AD4">registrar campoIntroducir = new JTextField(); campoIntroducir.setEditable( false ); campoIntroducir.addActionListener( new ActionListener() { // enviar mensaje al cliente public void actionPerformed( ActionEvent evento ) { enviarDatos( evento.getActionCommand() ); campoIntroducir.setText( "" ); }

);

contenedor.add( campoIntroducir, BorderLayout.NORTH ); // crear areaPantalla areaPantalla = new JTextArea(); contenedor.add( new JScrollPane( areaPantalla ), BorderLayout.CENTER ); setSize( 300, 150 ); setVisible( true ); } // fin del constructor de Servidor

// configurar y ejecutar el servidor public void ejecutarServidor() { // configurar servidor para que reciba conexiones; procesar las cone try { // Paso 1: crear un objeto ServerSocket. servidor = new ServerSocket( 12345, 100 ); <span class="IL_AD" id="IL_AD3">while</span> ( true ) { try { esperarConexion(); // Paso 2: esperar una conexin.
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
5 de 16

obtenerFlujos(); // Paso 3: obtener flujos de entrad procesarConexion(); // Paso 4: procesar la conexin.

// procesar excepcin EOFException cuando el cliente cierre la catch ( EOFException excepcionEOF ) { <span class="IL_AD" id="IL_AD10">System</span>.err.println( } finally { cerrarConexion(); ++contador; } // Paso 5: cerrar la conexin.

} // fin de instruccin while } // fin del bloque try // procesar problemas con E/S catch ( IOException excepcionES ) { excepcionES.printStackTrace(); } } // fin del mtodo ejecutarServidor

// esperar que la conexin llegue, despus mostrar informacin de la co private void esperarConexion() <span class="IL_AD" id="IL_AD5">throws { mostrarMensaje( "Esperando una conexin\n" ); conexion = servidor.<span class="IL_AD" id="IL_AD9">accept</span>(); mostrarMensaje( "Conexin " + contador + " recibida de: " + conexion.getInetAddress().getHostName() ); }

// obtener flujos para enviar y recibir datos private void obtenerFlujos() throws IOException { // establecer flujo de salida para los objetos salida = new ObjectOutputStream( conexion.getOutputStream() ); salida.flush(); // vaciar bfer de salida para enviar informacin de // establecer flujo de entrada para los objetos entrada = new ObjectInputStream( conexion.getInputStream() ); } mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );

// procesar la conexin con el cliente private void procesarConexion() throws IOException { // enviar mensaje de conexin exitosa al cliente String mensaje = "Conexin exitosa"; enviarDatos( mensaje );

// habilitar campoIntroducir para que el <span class="IL_AD" id="IL_ establecerCampoTextoEditable( true );


10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 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
6 de 16

do { // procesar los mensajes enviados por el cliente // leer el mensaje y mostrarlo en pantalla try { mensaje = ( String ) entrada.readObject(); mostrarMensaje( "\n" + mensaje ); }

// atrapar problemas que pueden ocurrir al tratar de leer del cli catch ( ClassNotFoundException excepcionClaseNoEncontrada ) { mostrarMensaje( "\nSe recibi un tipo de objeto desconocido" } } while ( !mensaje.<span class="IL_AD" id="IL_AD7">equals</span>( } // fin del mtodo procesarConexion

// cerrar flujos y socket private void cerrarConexion() { mostrarMensaje( "\nFinalizando la conexin\n" ); establecerCampoTextoEditable( false ); // deshabilitar campoIntroduc try { salida.close(); entrada.close(); conexion.close(); } catch( IOException excepcionES ) { excepcionES.printStackTrace(); }

// enviar mensaje al cliente private void enviarDatos( String mensaje ) { // enviar objeto al cliente try { salida.writeObject( "SERVIDOR>>> " + mensaje ); salida.flush(); mostrarMensaje( "\nSERVIDOR>>> " + mensaje ); } // procesar problemas que pueden ocurrir al enviar el objeto catch ( IOException excepcionES ) { areaPantalla.append( "\nError al escribir objeto" ); }

// mtodo utilitario que es llamado desde otros subprocesos para manipu // areaPantalla en el subproceso despachador de eventos private void mostrarMensaje( final String mensajeAMostrar ) { // mostrar mensaje del subproceso de ejecucin despachador de evento SwingUtilities.invokeLater(
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

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

new Runnable() {

// clase interna para asegurar que la GUI se ac

public void run() // actualiza areaPantalla { areaPantalla.append( mensajeAMostrar ); areaPantalla.setCaretPosition( areaPantalla.getText().<span class="IL_AD" id="IL_AD2" } } } // fin de la clase interna

); // fin de la llamada a SwingUtilities.invokeLater

// mtodo utilitario que es llamado desde otros subprocesos para manipu // campoIntroducir en el subproceso despachador de eventos private void establecerCampoTextoEditable( final boolean editable ) { // mostrar mensaje del subproceso de ejecucin despachador de evento SwingUtilities.invokeLater( new Runnable() { // clase interna para asegurar que la GUI se ac

public void run() // establece la capacidad de modificar a ca { campoIntroducir.setEditable( editable ); } } } // fin de la clase interna

); // fin de la llamada a SwingUtilities.invokeLater

public static void main( String args[] ) { JFrame.setDefaultLookAndFeelDecorated(true); Servidor aplicacion = new Servidor(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); aplicacion.ejecutarServidor(); } } // fin de la clase Servidor

El cdigo fuente de Cliente.java: 001 002 003 004 005 006 007 008 009 010 011 012
7 de 16

import import import import import

java.io.*; java.net.*; java.awt.*; java.awt.event.*; javax.swing.*;

public class Cliente extends JFrame { private JTextField campoIntroducir; private JTextArea areaPantalla; private ObjectOutputStream salida; private ObjectInputStream entrada; private String mensaje = "";
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068
8 de 16

private String servidorChat; private Socket cliente; // inicializar servidorChat y configurar GUI public Cliente( String host ) { super( "Cliente" );

servidorChat = host; // establecer el servidor al que se va a conect Container contenedor = getContentPane(); // crear campoIntroducir y registrar componente de escucha campoIntroducir = new JTextField(); campoIntroducir.setEditable( false ); campoIntroducir.addActionListener( new ActionListener() { // enviar mensaje al servidor public void actionPerformed( ActionEvent evento ) { enviarDatos( evento.getActionCommand() ); campoIntroducir.setText( "" ); }

);

contenedor.add( campoIntroducir, BorderLayout.NORTH ); // crear areaPantalla areaPantalla = new JTextArea(); contenedor.add( new JScrollPane( areaPantalla ), BorderLayout.CENTER ); setSize( 300, 150 ); setVisible( true ); } // fin del constructor de Cliente // conectarse al servidor y procesar mensajes del servidor private void ejecutarCliente() { // conectarse al servidor, obtener flujos, procesar la conexin try { conectarAServidor(); // Paso 1: crear un socket para realizar la obtenerFlujos(); // Paso 2: obtener los flujos de entrada y procesarConexion(); // Paso 3: procesar la conexin } // el servidor cerr la conexin catch ( EOFException excepcionEOF ) { System.err.println( "El cliente termino la conexin" ); }

// procesar los problemas que pueden ocurrir al comunicarse con el s catch ( IOException excepcionES ) {
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
9 de 16

excepcionES.printStackTrace();

finally { cerrarConexion(); // Paso 4: cerrar la conexin } } // fin del mtodo ejecutarCliente // conectarse al servidor private void conectarAServidor() throws IOException { mostrarMensaje( "Intentando realizar conexin\n" ); // crear Socket para realizar la conexin con el servidor cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 // mostrar la informacin de la conexin mostrarMensaje( "Conectado a: " + cliente.getInetAddress().getHostName() );

// obtener flujos para enviar y recibir datos private void obtenerFlujos() throws IOException { // establecer flujo de salida para los objetos salida = new ObjectOutputStream( cliente.getOutputStream() ); salida.flush(); // vacar bfer de salida para enviar informacin de // establecer flujo de entrada para los objetos entrada = new ObjectInputStream( cliente.getInputStream() ); } mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );

// procesar la conexin con el servidor private void procesarConexion() throws IOException { // habilitar campoIntroducir para que el usuario del cliente pueda e establecerCampoTextoEditable( true ); do { // procesar mensajes enviados del servidor // leer mensaje y mostrarlo en pantalla try { mensaje = ( String ) entrada.readObject(); mostrarMensaje( "\n" + mensaje ); } // atrapar los problemas que pueden ocurrir al leer del servidor catch ( ClassNotFoundException excepcionClaseNoEncontrada ) { mostrarMensaje( "\nSe recibi un objeto de tipo desconocido" } } while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 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
10 de 16

} // fin del mtodo procesarConexion

// cerrar flujos y socket private void cerrarConexion() { mostrarMensaje( "\nCerrando conexin" ); establecerCampoTextoEditable( false ); // deshabilitar campoIntroduc try { salida.close(); entrada.close(); cliente.close(); } catch( IOException excepcionES ) { excepcionES.printStackTrace(); }

// enviar mensaje al servidor private void enviarDatos( String mensaje ) { // enviar objeto al servidor try { salida.writeObject( "CLIENTE>>> " + mensaje ); salida.flush(); mostrarMensaje( "\nCLIENTE>>> " + mensaje ); } // procesar los problemas que pueden ocurrir al enviar el objeto catch ( IOException excepcionES ) { areaPantalla.append( "\nError al escribir el objeto" ); }

// mtodo utilitario que es llamado desde otros subprocesos para manipu // areaPantalla en el subproceso despachador de eventos private void mostrarMensaje( final String mensajeAMostrar ) { // mostrar mensaje del subproceso de ejecucin de la GUI SwingUtilities.invokeLater( new Runnable() { // clase interna para asegurar que la GUI se ac public void run() // actualiza areaPantalla { areaPantalla.append( mensajeAMostrar ); areaPantalla.setCaretPosition( areaPantalla.getText().length() ); } } } // fin de la clase interna

); // fin de la llamada a SwingUtilities.invokeLater

// mtodo utilitario que es llamado desde otros subprocesos para manipu // campoIntroducir en el subproceso despachador de eventos
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

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

private void establecerCampoTextoEditable( final boolean editable ) { // mostrar mensaje del subproceso de ejecucin de la GUI SwingUtilities.invokeLater( new Runnable() { // clase interna para asegurar que la GUI se ac

public void run() // establece la capacidad de modificar camp { campoIntroducir.setEditable( editable ); } } } // fin de la clase interna

); // fin de la llamada a SwingUtilities.invokeLater

public static void main( String args[] ) { JFrame.setDefaultLookAndFeelDecorated(true); Cliente aplicacion; if ( args.length == 0 ) aplicacion = new Cliente( "127.0.0.1" ); else aplicacion = new Cliente( args[ 0 ] ); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); aplicacion.ejecutarCliente();

} // fin de la clase Cliente

Descargar cdigo fuente

Los ejercicios utilizados en este post estn basados en ejemplos del libro Cmo programar en Java de Deitel, y por lo tanto estn bajo la licencia que esta editorial disponga. 126 Comentarios | deja el tuyo

2 enlaces entrantes
[cdigo] Uso de Datagramas en Java (Protocolo UDP) Bibliografa temtica axenedu

11 de 16

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

124 Comentarios en [cdigo] Conexiones ClienteServidor mediante sockets en Java


Comentarios anteriores 1. Henry dice: julio 16, 2011 a las 2:54 pm muy bueno tu programa pero como se prodia ser un servidor muchos clientes Responder 2. osmany dice: septiembre 15, 2011 a las 4:58 am En la conexion del cliente, despues de conrmar que se conecto no avanza mas. Cuando debuggeo se queda esperando por el ujo de entrada y no muestra que se recibio los ujos de E/S. que pudiera estar pasando. Responder 3. larry dice: noviembre 28, 2011 a las 8:31 pm buenas tardes amigo! mi prof nos ha pedido crear un hilo en este cdigo para poder establecer la comunicacin con el cliente, si me puedes ayudar te lo agradezco, te anexo los dos cdigos el servidor y el cliente. servidor: package laboratorio; import java.net.*; import java.io.*; class Servicio { public void procesar(Socket Canal) throws IOException { int Num1,Num2,res = 0; String OP; DataOutputStream canal_salida_Serv = new DataOutputStream (Canal.getOutputStream()); DataInputStream canal_entrada_Serv = new DataInputStream (Canal.getInputStream()); OP = canal_entrada_Serv.readUTF(); System.out.println( OP ); Num1 = canal_entrada_Serv.readInt(); System.out.println( Num1 ); Num2 = canal_entrada_Serv.readInt(); System.out.println( Num2 );

12 de 16

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

if (OP .equals(+)){ res= Num1 + Num2; } if (OP .equals(-)){ res= Num1 Num2; } if (OP .equals(*)){ res= Num1 * Num2; } if (OP .equals(/)){ res= Num1 / Num2; } System.out.println( res ); canal_salida_Serv.writeInt(res); Canal.close(); } } public class servidor { public static void main( String args[] ) throws IOException { Servicio miServicio = new Servicio(); boolean hayErrores=true; ServerSocket s = (ServerSocket)null; Socket s1 = (Socket) null; int puerto = 30087; while (hayErrores) { hayErrores=false; try { s=new ServerSocket(puerto); } catch( IOException e ) { hayErrores = true; System.out.println( Error al conectar al puerto: +e ); } } while( true ) { try { s1 = s.accept(); } catch( IOException e ) { System.out.println( Error al aceptar conexin: +e );
13 de 16 10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

} miServicio.procesar(s1); } // Fin del ciclo innito del servidor } // Fin del mtodo main } // Fin de la clase cliente: import java.net.*; import java.io.*; public class Cliente_Socket { public static void main( String args[] )throws IOException { Socket s=(Socket) null; DataInputStream canal_entrada_C; DataOutputStream canal_salida_C; try { s = new Socket (localhost,33525); canal_entrada_C = new DataInputStream (s.getInputStream()); canal_salida_C = new DataOutputStream (s.getOutputStream()); canal_salida_C.writeUTF(hola mundo); System.out.println(El Cliente dice: hola mundo); String Resp = canal_entrada_C.readUTF(); System.out.println(El Servidor responde: + Resp); s.close(); } catch( IOException e ) { System.out.println( No se puede conectar al servidor: +e ); } } // Fin del main } // Fin de la clase Cliente Responder 4. aldemaro dice: enero 29, 2012 a las 4:04 am gracias por el codigo man me ahorraste trabajo xD!!! Responder 5. Jonathan dice: enero 29, 2012 a las 4:05 am Men un gran aporte, me ayudo bastante.! GRACIAS Responder 6.
14 de 16

Cristian dice:
10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

enero 29, 2012 a las 5:47 am No esta mal el ejemplo, pero una pequea apreciacion. en lugar de decir que no comentas el codigo por falta de tiempo, deberias de decir que no comentas el texto por ser de otra persona, que este ejemplo esta copiado linea por linea de la web http://www.TodoJava.com. No hacer codigo de terceros como propios porfavor, o almenos pon una simple nota de agradecimiento a su creador Responder Cristian dice: enero 29, 2012 a las 10:46 am Y qu? As no sea mo pues tambin puedo decir que no lo comento por falta de tiempo. O crees que no entiendo un cdigo tan trivial? Por cierto, no es de TodoJava.com, es del libro de Deitel como dice en el cuadro azul abajo de la entrada. Antes de criticar, lee (pero no en Internet que es una cloaca virtual, sino en libros), infrmate, analiza, etc. Responder 7. Lucrecia dice: marzo 8, 2012 a las 4:04 am Hola me parece muy buen codigo, yo quisiera saber como podria hacerse este chat para varias personas y con hilos Responder 8. AmilcarJC dice: marzo 8, 2012 a las 4:13 am Q Excelente tu codigo men, me recomendaron esta pagina y la verdad le entendi a eso de sockets y estoy investigando como hacerlo para varios clientes. Se te agradece el aporte Responder 9. Claudia Elena dice: marzo 14, 2012 a las 12:31 pm hola oye el codigo que pusiste en que programa lo hiciste lo podre corren en crimson?? Responder 10. LEONARDO dice: mayo 2, 2012 a las 4:01 pm

15 de 16

10/05/12 23:20

[cdigo] Conexiones Cliente-Servidor mediante sockets e...

http://casidiablo.net/java-socket-chat-basico/

ESTE SOCKET USA TCP O UDP GRACIAS Responder Comentarios anteriores

Djanos tu comentario!
Tu nombre Homepage E-mail (para Gravatar) Tu comentario

Enviar comentario
2006 - 2010 casidiablo.net. Pocos derechos reservados.

16 de 16

10/05/12 23:20

S-ar putea să vă placă și