Como Programar un Chat.docx

14
28-5-2014 Como Programar un Chat (JAVA) Módulo 3 Submodulo 2 BRANDON DURAN FLORES SMEC-4A I.S.C. EDGAR BRAVO HUERTA

description

como programar un chat en la plataforma java espero y les pueda servir.

Transcript of Como Programar un Chat.docx

Como Programar un Chat (JAVA)

INTRODUCCION

CHAT.tambin conocido comocibercharla, designa una comunicacin escrita realizada de manera instantnea mediante el uso de unsoftwarey a travs de Internetentre dos, tres o ms personas ya sea de manera pblica a travs de los llamados chats pblicos (mediante los cuales cualquier usuario puede tener acceso a la conversacin) o privada, en los que se comunican dos o ms personas.

JAVA.Java es una tecnologa que se usa para el desarrollo de aplicaciones que convierten a la Web en un elemento ms interesante y til. Java no es lo mismo que javascript, que se trata de una tecnologa sencilla que se usa para crear pginas web y solamente se ejecuta en el explorador.

COMO PROGRAMAR UN CHAT EN JAVA

Empezaremos describiendo las clases del lado del servidor:

Clase PrincipalChat:

Esta clase implementa la interfaz grfica para poder mostrar los mensajes entrantes y un JTextField para poder enviarlos. La interfaz contiene un men para poder salir del programa.En el main se puede ver que se espera conexiones de clientes.

1. packageservidor;2. 3. importjava.awt.BorderLayout;4. importjava.awt.Color;5. importjava.awt.event.ActionEvent;6. importjava.awt.event.ActionListener;7. importjava.io.IOException;8. importjava.net.InetAddress;9. importjava.net.ServerSocket;10. importjava.net.Socket;11. importjava.util.concurrent.ExecutorService;12. importjava.util.concurrent.Executors;13. importjava.util.logging.Level;14. importjava.util.logging.Logger;15. importjavax.swing.*;16. 17. /**Clase que se encarga de correr los threads de enviar y recibir texto18. * y de crear la interfaz grafica.19. *20. * @author Rafa21. */22. publicclassPrincipalChatextendsJFrame{23. publicJTextFieldcampoTexto;//Para mostrar mensajes de los usuarios24. publicJTextAreaareaTexto;//Para ingresar mensaje a enviar25. privatestaticServerSocketservidor;//26. privatestaticSocketconexion;//Socket para conectarse con el cliente27. privatestaticStringip="127.0.0.1";//ip a la cual se conecta28. 29. publicstaticPrincipalChat main;30. 31. publicPrincipalChat(){32. super("Servidor");//Establece titulo al Frame33. 34. campoTexto=newJTextField();//crea el campo para texto35. campoTexto.setEditable(false);//No permite que sea editable el campo de texto36. add(campoTexto,BorderLayout.NORTH);//Coloca el campo de texto en la parte superior37. 38. areaTexto=newJTextArea();//Crear displayArea39. areaTexto.setEditable(false);40. add(newJScrollPane(areaTexto),BorderLayout.CENTER);41. areaTexto.setBackground(Color.orange);//Pone de color cyan al areaTexto42. areaTexto.setForeground(Color.BLACK);//pinta azul la letra en el areaTexto43. campoTexto.setForeground(Color.BLACK);//pinta toja la letra del mensaje a enviar44. 45. 46. //Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu47. JMenumenuArchivo=newJMenu("Archivo");48. JMenuItemsalir=newJMenuItem("Salir");49. menuArchivo.add(salir);//Agrega el submenu Salir al menu menuArchivo50. 51. JMenuBarbarra=newJMenuBar();//Crea la barra de menus52. setJMenuBar(barra);//Agrega barra de menus a la aplicacion53. barra.add(menuArchivo);//agrega menuArchivo a la barra de menus54. 55. //Accion que se realiza cuando se presiona el submenu Salir56. salir.addActionListener(newActionListener(){//clase interna anonima57. publicvoidactionPerformed(ActionEvente){58. System.exit(0);//Sale de la aplicacion59. }60. });61. 62. setSize(300,320);//Establecer tamano a ventana63. setVisible(true);//Pone visible la ventana64. }65. 66. //Para mostrar texto en displayArea67. publicvoidmostrarMensaje(Stringmensaje){68. areaTexto.append(mensaje+"\n");69. }70. publicvoidhabilitarTexto(booleaneditable){71. campoTexto.setEditable(editable);72. }73. 74. /**75. * @param args the command line arguments76. */77. publicstaticvoidmain(String[]args){78. PrincipalChat main=newPrincipalChat();//Instanciacion de la clase Principalchat79. main.setLocationRelativeTo(null);//Centrar el JFrame80. main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//habilita cerrar la ventana81. ExecutorService executor=Executors.newCachedThreadPool();//Para correr los threads82. 83. try{84. //main.mostrarMensaje("No se encuentra Servidor");85. servidor=newServerSocket(11111,100);86. main.mostrarMensaje("Esperando Cliente ...");87. 88. //Bucle infinito para esperar conexiones de los clientes89. while(true){90. try{91. conexion=servidor.accept();//Permite al servidor aceptar conexiones 92. 93. //main.mostrarMensaje("Conexion Establecida");94. main.mostrarMensaje("Conectado a : "+conexion.getInetAddress().getHostName());95. 96. main.habilitarTexto(true);//permite escribir texto para enviar97. 98. //Ejecucion de los threads99. executor.execute(newRecibe(conexion, main));//client100. executor.execute(newEnvia(conexion, main));101. }catch(IOExceptionex){102. Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE,null, ex);103. }104. }105. }catch(IOExceptionex){106. Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE,null, ex);107. }//Fin del catch108. finally{109. }110. executor.shutdown();111. }112. }

Clase ThreadEnvia:En esta clase establecemos nuestro canal de salida tipoObjectOutputStream, el cual nos sirve para escribir el mensaje, enviarlo y mostrarlo en pantalla mediante el mtodo enviarDatos().Adems declaramos la variable conexin tipo Socket, la cual se encarga de establecer el flujo de datos entre cliente y servidor.

1. packageservidor;2. 3. importjava.io.IOException;4. importjava.io.ObjectOutputStream;5. importjava.net.Socket;6. importjava.awt.event.ActionEvent;7. importjava.awt.event.ActionListener;8. importjava.net.SocketException;9. 10. publicclassThreadEnviaimplementsRunnable{11. privatefinalPrincipalChat main;12. privateObjectOutputStreamsalida;13. privateStringmensaje;14. privateSocketconexion;15. 16. publicThreadEnvia(Socketconexion,finalPrincipalChat main){17. this.conexion=conexion;18. this.main=main;19. 20. //Evento que ocurre al escribir en el areaTexto21. main.campoTexto.addActionListener(newActionListener(){22. publicvoidactionPerformed(ActionEventevent){23. mensaje=event.getActionCommand();24. enviarDatos(mensaje);//se envia el mensaje25. main.campoTexto.setText("");//borra el texto del enterfield26. }//Fin metodo actionPerformed27. }28. );//Fin llamada a addActionListener29. }30. 31. //enviar objeto a cliente32. privatevoidenviarDatos(Stringmensaje){33. try{34. salida.writeObject("Servidor>>> "+mensaje);35. salida.flush();//flush salida a cliente36. main.mostrarMensaje("Servidor>>> "+mensaje);37. }//Fin try38. catch(IOExceptionioException){39. main.mostrarMensaje("Error escribiendo Mensaje");40. }//Fin catch 41. 42. }//Fin methodo enviarDatos43. 44. //manipula areaPantalla en el hilo despachador de eventos45. publicvoidmostrarMensaje(Stringmensaje){46. main.areaTexto.append(mensaje);47. }48. 49. publicvoidrun(){50. try{51. salida=newObjectOutputStream(conexion.getOutputStream());52. salida.flush();53. }catch(SocketExceptionex){54. }catch(IOExceptionioException){55. ioException.printStackTrace();56. }catch(NullPointerExceptionex){57. }58. }59. 60. }Clase ThreadRecibe:En esta clase establecemos nuestro canal de entrada tipo ObjectInputStream, el cual se encarga de recibir los mensajes enviados por el cliente o servidor.Aqu se procesa los mensajes recibidos y luego son mostrados en pantalla.Es importante aclarar que se debe cerrar el canal de entrada de datos y el Socket de conexin una vez finalizado el flujo de datos.1. packageservidor;2. 3. importjava.io.EOFException;4. importjava.io.IOException;5. importjava.io.ObjectInputStream;6. importjava.net.Socket;7. importjava.net.SocketException;8. importjava.util.logging.Level;9. importjava.util.logging.Logger;10. 11. publicclassThreadRecibeimplementsRunnable{12. privatefinalPrincipalChat main;13. privateStringmensaje;14. privateObjectInputStreamentrada;15. privateSocketcliente;16. 17. 18. //Inicializar chatServer y configurar GUI19. publicThreadRecibe(Socketcliente, PrincipalChat main){20. this.cliente=cliente;21. this.main=main;22. }23. 24. publicvoidmostrarMensaje(Stringmensaje){25. main.areaTexto.append(mensaje);26. }27. 28. publicvoidrun(){29. try{30. entrada=newObjectInputStream(cliente.getInputStream());31. }catch(IOExceptionex){32. Logger.getLogger(ThreadRecibe.class.getName()).log(Level.SEVERE,null, ex);33. }34. do{//procesa los mensajes enviados dsd el servidor35. try{//leer el mensaje y mostrarlo36. mensaje=(String)entrada.readObject();//leer nuevo mensaje37. main.mostrarMensaje(mensaje);38. }//fin try39. catch(SocketExceptionex){40. }41. catch(EOFExceptioneofException){42. main.mostrarMensaje("Fin de la conexion");43. break;44. }//fin catch45. catch(IOExceptionex){46. Logger.getLogger(ThreadRecibe.class.getName()).log(Level.SEVERE,null, ex);47. }catch(ClassNotFoundExceptionclassNotFoundException){48. main.mostrarMensaje("Objeto desconocido");49. }//fin catch 50. 51. }while(!mensaje.equals("Servidor>>> TERMINATE"));//Ejecuta hasta que el server escriba TERMINATE52. 53. try{54. entrada.close();//cierra input Stream55. cliente.close();//cieraa Socket56. }//Fin try57. catch(IOExceptionioException){58. ioException.printStackTrace();59. }//fin catch60. 61. main.mostrarMensaje("Fin de la conexion");62. System.exit(0);63. }64. }

En el paquete Cliente encontramos:

Clase PrincipalChat:Esta clase implementa la interfaz grafica para poder mostrar los mensajes entrantes y un JTextField para poder enviarlos. La interfaz contiene un menu para poder salir del programa.Esta clase busca servidores para poder conectarse.1. packageservidor;2. 3. importjava.awt.BorderLayout;4. importjava.awt.Color;5. importjava.awt.event.ActionEvent;6. importjava.awt.event.ActionListener;7. importjava.io.IOException;8. importjava.net.InetAddress;9. importjava.net.ServerSocket;10. importjava.net.Socket;11. importjava.util.concurrent.ExecutorService;12. importjava.util.concurrent.Executors;13. importjava.util.logging.Level;14. importjava.util.logging.Logger;15. importjavax.swing.*;16. 17. /**Clase que se encarga de correr los threads de enviar y recibir texto18. * y de crear la interfaz grafica.19. *20. * @author Rafa21. */22. publicclassPrincipalChatextendsJFrame{23. publicJTextFieldcampoTexto;//Para mostrar mensajes de los usuarios24. publicJTextAreaareaTexto;//Para ingresar mensaje a enviar25. privatestaticServerSocketservidor;//26. privatestaticSocketconexion;//Socket para conectarse con el cliente27. privatestaticStringip="127.0.0.1";//ip a la cual se conecta28. 29. publicstaticPrincipalChat main;30. 31. publicPrincipalChat(){32. super("Servidor");//Establece titulo al Frame33. 34. campoTexto=newJTextField();//crea el campo para texto35. campoTexto.setEditable(false);//No permite que sea editable el campo de texto36. add(campoTexto,BorderLayout.NORTH);//Coloca el campo de texto en la parte superior37. 38. areaTexto=newJTextArea();//Crear displayArea39. areaTexto.setEditable(false);40. add(newJScrollPane(areaTexto),BorderLayout.CENTER);41. areaTexto.setBackground(Color.orange);//Pone de color cyan al areaTexto42. areaTexto.setForeground(Color.BLACK);//pinta azul la letra en el areaTexto43. campoTexto.setForeground(Color.BLACK);//pinta toja la letra del mensaje a enviar44. 45. 46. //Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu47. JMenumenuArchivo=newJMenu("Archivo");48. JMenuItemsalir=newJMenuItem("Salir");49. menuArchivo.add(salir);//Agrega el submenu Salir al menu menuArchivo50. 51. JMenuBarbarra=newJMenuBar();//Crea la barra de menus52. setJMenuBar(barra);//Agrega barra de menus a la aplicacion53. barra.add(menuArchivo);//agrega menuArchivo a la barra de menus54. 55. //Accion que se realiza cuando se presiona el submenu Salir56. salir.addActionListener(newActionListener(){//clase interna anonima57. publicvoidactionPerformed(ActionEvente){58. System.exit(0);//Sale de la aplicacion59. }60. });61. 62. setSize(300,320);//Establecer tamano a ventana63. setVisible(true);//Pone visible la ventana64. }65. 66. //Para mostrar texto en displayArea67. publicvoidmostrarMensaje(Stringmensaje){68. areaTexto.append(mensaje+"\n");69. }70. publicvoidhabilitarTexto(booleaneditable){71. campoTexto.setEditable(editable);72. }73. 74. /**75. * @param args the command line arguments76. */77. publicstaticvoidmain(String[]args){78. PrincipalChat main=newPrincipalChat();//Instanciacion de la clase Principalchat79. main.setLocationRelativeTo(null);//Centrar el JFrame80. main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//habilita cerrar la ventana81. ExecutorService executor=Executors.newCachedThreadPool();//Para correr los threads82. 83. try{84. //main.mostrarMensaje("No se encuentra Servidor");85. servidor=newServerSocket(11111,100);86. main.mostrarMensaje("Esperando Cliente ...");87. 88. //Bucle infinito para esperar conexiones de los clientes89. while(true){90. try{91. conexion=servidor.accept();//Permite al servidor aceptar conexiones 92. 93. //main.mostrarMensaje("Conexion Establecida");94. main.mostrarMensaje("Conectado a : "+conexion.getInetAddress().getHostName());95. 96. main.habilitarTexto(true);//permite escribir texto para enviar97. 98. //Ejecucion de los threads99. executor.execute(newRecibe(conexion, main));//client100. executor.execute(newEnvia(conexion, main));101. }catch(IOExceptionex){102. Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE,null, ex);103. }104. }105. }catch(IOExceptionex){106. Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE,null, ex);107. }//Fin del catch108. finally{109. }110. executor.shutdown();111. }112. }

Las clases descritas en el paquete Cliente: ThreadRecibe y ThreadEnvia son exactamente las mismas que se describieron en el paquete Servidor.

Nuestro proyecto se vera asi:

El resultado final se mostrara de la siguiente manera:

CONCLUSION:

En esta investigacin aprend a saber que era un chat y con que podemos programar uno, a conocer que es Java y como lo podemos utilizar para programar un chat desde cero en la aplicacin Java con sockets , a conocer las clases que debe contener y a como configurar servidor entre otros, como se ve el programa una vez programado hacer una prueba de que realmente funciona el chat

Bibliografas:

http://aflrovvs.blogspot.mx/2012/07/como-hacer-un-chat-con-sockets-en-java.html https://www.youtube.com/watch?v=zZIeUCBKwjc