Como Programar un Chat.docx
-
Upload
brandon-duran-flores -
Category
Documents
-
view
212 -
download
0
description
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