Está en la página 1de 36

“Año de la Diversificación Productiva y del Fortalecimiento de la Educación”

UNIVERSIDAD NACIONAL DE
UCAYALI
Facultad de Ingeniería de Sistemas y de Ingeniería Civil
Escuela Profesional de Ingeniería de Sistemas

Curso

: Sistemas Distribuidos

Tema

: Conexión de socket, Cliente – Servidor

Docente

: Ing. Edilberto Aliaga Romayna.

Alumnos

: García Acosta Gino Anderson
Peña Linares Giezi Miguel
Lozano García Oscar
Puyo Torres Lennin Heison
Arana Tello Jose G
Trujillo Silvano Rony Aderly

Ciclo

: VIII

PROGRAMACION DE SOCKET CON JAVA Y MYSQL

Un socket es un punto final de un proceso de comunicación. Es una abstracción
que permite manejar de una forma sencilla la comunicación entre procesos,
aunque estos procesos se encuentren en sistemas distintos, sin necesidad de
conocer el funcionamiento de los protocolos de comunicación subyacentes.
Los mecanismos de comunicación entre procesos pueden tener lugar dentro de
la misma máquina o a través de una red. Generalmente son usados en forma de
cliente-servidor, es decir, cuando un cliente y un servidor establecen una
conexión, lo hacen a través de un socket.
Básicamente, este es el funcionamiento de los Socket que necesitamos para una
conexión TCP. En el que podemos distinguir dos tipos de Socket el del Servidor
y el del Cliente.
La creación del socket en el servidor se remite a crear el socket, indicar porque
puerto se harán las escuchas y esperar a la llamada de un cliente para aceptar
la conexión, en cambio un cliente creará el socket e indicará donde se encuentra
y por qué puerto quiere conectarse, de esta forma Cliente y Servidor crearán una
conexión.
Servidor
Para crear los socket se crea un objeto del tipo ServerSocket, este método
pertenece a la clase java.net.Serversocket
Una vez que hemos creado el objeto socket mandamos un parámetro que
indicará el puerto por el que se realzará las comunicaciones.
Para realizar una conexión entre Cliente-Servidor, el servidor usará el método
socket.accept para confirmar que se ha iniciado la conexión.

Cliente
Primero crea un objeto del tipo Socket que pertenece a la clase
java.net.Serversocket, después se obtiene un objeto InetAddress, y usando el
método getByName le indicamos donde se va a ejecutar el cliente, en nuestro
caso indicamos que será en localhost.
Finalmente creamos un objeto de tipo socket al que pasaremos la dirección
donde se está ejecutando el cliente, y el puerto por donde se conectará al
servidor.

Primero se comenzara con la parte del cliente:
CLASE bdManager
Para establecer la conexión con MysqlWorbench:
package distribuidos_socket;

import java.sql.Connection;
import java.sql.DriverManager;
public class dbManager {
private

final

String

url="jdbc:mysql://localhost:3306/chat?zeroDateTimeBehavior=convertToN
ull";
private final String driver="com.mysql.jdbc.Driver";
private final String user="root";

} public Connection getConnection(){ error = null. private String error.out. try{ .getConnection(url. try{ Class.getMessage()). System. return (DriverManager.println(e.toString(). } public void closeConnection(Connection con){ error = null.pass)).forName(driver). System.println("ERROR DBMANAGER"). }catch (Exception e){error.user. } return null.private final String pass="miguel". public String getError() { return error.out.

setVisible(true).con.swing.setIpUsuario( JOptionPane.close().cliObje. NewJFrame.setNick(JOptionPane.toString(). new NewJFrame().showInputDialog("Ingrese su Nick")). import javax.JOptionPane. }catch (Exception e){error=e.showInputDialog("Ingrese su IP:")).} } } CLASE inicio: package distribuidos_socket. public class inicio { public static usuario nv.cliObje. } Para la parte del cliente se le pedirá que ingrese una ip valida: . public static void main(String[] args) { NewJFrame.

private String mensaje. private String ip. } public void setNick(String nick) { this.io.Serializable. import java. public class Cliente implements Serializable{ private String nick. . public String getNick() { return nick.Luego un nombre (Nick): CLASE cliente package distribuidos_socket.nick = nick.

} public String getMensaje() { return mensaje. } } Para después se mostrara la siguiente interfaz: .mensaje = mensaje.ip = ip.} public String getIp() { return ip. } public void setIp(String ip) { this. } public void setMensaje(String mensaje) { this.

import java.net.Socket.io.ObjectInputStream. } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { . import java.net.io.start(). import java.ObjectOutputStream.ServerSocket.io.package distribuidos_socket. hilo.IOException.swing. import java. import java.JFrame implements Runnable { /** * Creates new form NewJFrame */ public NewJFrame() { initComponents(). Thread hilo=new Thread(this). public class NewJFrame extends javax.

txtNick = new javax. txtMensaje = new javax.swing.EXIT_ON_CLOSE).swing.JTextField().JLabel(). . txtIp = new javax.swing.jPanel1 = new javax.swing.swing. jLabel3 = new javax.JTextField().swing.JButton().swing. btnEnviar = new javax.JTextArea(). jScrollPane1 = new javax. djfhdjfd = new javax.swing. setDefaultCloseOperation(javax. jLabel3.setColumns(20).swing. jLabel2.swing.JLabel().JPanel(). jButton1 = new javax.setText("Nick"). jLabel2 = new javax. txtMensajes = new javax.JButton().WindowConstants.JLabel().setText("Ip"). txtMensajes. djfhdjfd.swing.JTextField().JScrollPane().setText("Mensaje").swing.

awt.event.event.awt.setText("Limpiar"). } public void keyTyped(java.KeyEvent evt) { btnEnviarKeyTyped(evt). jScrollPane1. jButton1.addActionListener(new java.awt.setText("Enviar").awt.ActionEvent evt) { btnEnviarActionPerformed(evt).awt.event.ActionListener() { public void actionPerformed(java.ActionListener() { public void actionPerformed(java.KeyAdapter() { public void keyPressed(java. } }).setRows(5).setViewportView(txtMensajes).txtMensajes.ActionEvent evt) { jButton1ActionPerformed(evt). btnEnviar.event.event. btnEnviar.event. .addActionListener(new java.KeyEvent evt) { btnEnviarKeyPressed(evt).awt. btnEnviar. } }).awt.addKeyListener(new java. jButton1.event.

addComponent(jScrollPane1. jPanel1Layout.Alignment.swing.addGap(19.swing. javax.GroupLayout jPanel1Layout = new javax.createParallelGroup(javax.createSequentialGroup() .swing.LEADING) .LEADING.addGroup(jPanel1Layout.addGroup(jPanel1Layout.GroupLayout.GroupLayout.swing.createParallelGroup(javax.GroupLayout.GroupLayout.swing.GroupLayout(jPanel1). Alignment.swing.createSequentialGroup() . 19.Align ment.Align ment.PREFERRED_SIZE) .PREFERRED_SIZE.createParallelGroup(javax. javax.addComponent(jButton1) .swing.GroupLayout. false) .GroupLayout. 19) . jPanel1.swing.addGroup(jPanel1Layout.LEADING) .createParallelGroup(javax.addGroup(jPanel1Layout. javax. 392.LEADI NG) .setHorizontalGroup( jPanel1Layout.} }).addGroup(jPanel1Layout.setLayout(jPanel1Layout).

false) .setVerticalGroup( jPanel1Layout.LayoutStyle.addContainerGap(36. 39) .addComponent(jLabel2.MAX_VALUE) . 39.swing.addGap(39.createParallelGroup(javax.MAX_VALUE)) ).ComponentPlacement.DEFAULT_SIZE. 10. Short.swing.addComponent(djfhdjfd) ..createSequentialGroup() . javax. javax.addGroup(jPanel1Layout.createParallelGroup(javax.swing.swing. jPanel1Layout.addPreferredGap(javax.swing.DEFAULT_SIZE.GroupLayout.Align ment.addComponent(txtIp) .LEADI NG) .addComponent(txtMensaje. javax.GroupLayout.addComponent(jLabel3) .LEADING.addGroup(jPanel1Layout.GroupLayout.MAX_VALUE)) .swing.RELATED.PREFERRED_SIZE.addComponent(btnEnviar)))) . javax.GroupLayout. Short.Alignment.addComponent(txtNick) .GroupLayout.swing.GroupLayout. Short. 181.PREFERRED_SIZE)) .

javax.GroupLayout.PREFERRED_SIZE.Align ment.swing. javax. javax.BASELINE) .GroupLayout. javax. 20) . javax. javax.GroupLayout.GroupLayout.swing.swing.addGroup(jPanel1Layout..swing.swing.addGap(18.LayoutStyle.ComponentPlacement.addComponent(djfhdjfd) .addGroup(jPanel1Layout.swing.DEFAULT_SIZE.PREFERRED_SIZE) . 20.createParallelGroup(javax.addComponent(txtNick.TRAILING) .GroupLayout.createParallelGroup(javax.BASELINE) .swing.swing.GroupLayout.GroupLayout.addComponent(jLabel2)) .createParallelGroup(javax.addPreferredGap(javax. 18) .swing.Align ment.addGroup(jPanel1Layout.GroupLayout.GroupLayout.Align ment.addComponent(txtIp.UNRELATE D) .addGap(20.addComponent(jLabel3) .swing. 18.PREFERRED_SIZE)) .DEFAULT_SIZE.PREFERRED_SIZE.

addGroup(jPanel1Layout.swing.LayoutStyle.GroupLayout.GroupLayout(getContentPane()).GroupLayout.GroupLayout. javax.swing.swing.setLayout(layout). 26) .addPreferredGap(javax.UNRELATE D) . javax.swing.ComponentPlacement. javax.swing.Align ment.MAX_VALUE)) ).addComponent(jButton1) . getContentPane().swing.swing. 146.GroupLayout.createParallelGroup(javax.GroupLayout. javax.GroupLayout.PREFERRED_SIZE) .setHorizontalGroup( layout.createParallelGroup(javax.addGap(26.PREFERRED_SIZE.addComponent(jScrollPane1.DEFAULT_SIZE.addContainerGap(19.GroupLayout.BASELINE) . javax.swing. 26.PREFERRED_SIZE.addComponent(txtMensaje.GroupLayout layout = javax. Short..swing.PREFERRED_SIZE) .swing. javax.LEADING) new .addComponent(btnEnviar))) .Alignment. layout.

layout.ActionEvent evt) { if(evt.DEFAULT_SIZE. pack(). Short.getSource()==btnEnviar){ try{ Socket cliente=new Socket("192.GroupLayout.LEADING) .event. .createSequentialGroup() .addContainerGap()) ).9081).awt.1.swing.GroupLayout.swing.addGroup(layout.DEFAULT_SIZE.MAX_VALUE) .GroupLayout. }// </editor-fold> private void btnEnviarActionPerformed(java.GroupLayout. Short.DEFAULT_SIZE. javax.createSequentialGroup() . javax..addComponent(jPanel1.addGroup(layout.DEFAULT_SIZE.swing.addContainerGap()) ).168. javax.36".addComponent(jPanel1.swing. javax.GroupLayout.Alignment.setVerticalGroup( layout.MAX_VALUE) .createParallelGroup(javax.swing.

Cliente cliObj=new Cliente(). } catch (Exception ex){ System.getText()).event.close().getText()). . } } } private void btnEnviarKeyPressed(java.KeyEvent evt) { } private void btnEnviarKeyTyped(java.KeyEvent evt) { // TODO add your handling code here: } private void jButton1ActionPerformed(java.println(ex. cliObj.setText(null).awt.event.getText()).setMensaje(txtMensaje.ActionEvent evt) { txtIp. cliente.setNick(txtNick. flujo.out. cliObj.awt.setIp(txtIp. ObjectOutputStream flujo=new ObjectOutputStream(cliente.getMessage()).event.awt.getOutputStream()). cliObj.writeObject(cliObj).

break.com/javase/tutorial/uiswing/lookandfeel/plaf.txtMensaje. stay with the default look and feel.swing. txtMensajes.UIManager.UIManager.html */ try { for (javax.setText(null).setText(null).LookAndFeelInfo info javax.getClassName()).UIManager.swing. txtNick.getInstalledLookAndFeels()) { if ("Nimbus".swing.getName())) { javax.equals(info.setText(null). } public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available. * For details see http://download.setLookAndFeel(info. } } : .oracle.

log(java.SEVERE.util.setVisible(true).UnsupportedLookAndFeelException ex) { java.class.Logger. } .getLogger(NewJFrame.class.lo gging.class.Level.getName()).lo gging.Logger.getName()). } //</editor-fold> /* Create and display the form */ java. ex).lo gging.invokeLater(new Runnable() { public void run() { new NewJFrame().EventQueue.Level.logging. null. ex).logging.log(java.lo gging.util. null.SEVERE.swing.log(java.logging.util.util.logging.util.Level.getLogger(NewJFrame.getName()).util.Logger. null. ex). } catch (InstantiationException ex) { java.Level.util. } catch (IllegalAccessException ex) { java.log(java.class.getLogger(NewJFrame.} catch (ClassNotFoundException ex) { java.SEVERE.getName()). ex). null.util.getLogger(NewJFrame.awt.Logger. } catch (javax.SEVERE.

JScrollPane jScrollPane1. // End of variables declaration @Override public void run() { try { ServerSocket serv=new ServerSocket(9090).JTextField txtNick.JLabel jLabel3.JTextArea txtMensajes. . private static javax.JTextField txtMensaje.JLabel jLabel2.JTextField txtIp. private javax.swing. private javax.}).swing. private javax.swing.swing.swing.swing.swing.JButton jButton1.swing.swing.do not modify private javax. private javax. Socket cliente.JButton btnEnviar. private javax. private javax. private javax. private javax. private javax.JPanel jPanel1.JLabel djfhdjfd. } // Variables declaration .swing.swing.

accept().getNick()+": \n "+cliObj.err. cliente. ObjectInputStream flujo=new ObjectInputStream(cliente.getMessage()).close().getMensaje()).readObject(). txtMensajes.getInputStream()). } } } .Cliente cliObj. while(true) { cliente=serv. cliObj=(Cliente)flujo. } } catch (IOException | ClassNotFoundException e) { System.println("Error en recibir datos de servidor en cliente "+e.append("\n "+cliObj.

Clase conversación package distribuidos_socket.util.Calendar. public class Conversacion { . import java. import java.util.ArrayList.

private Calendar fecha. public Calendar getFecha() { return fecha. } public ArrayList <usuario> getUsuarios() { return usuarios. } .fecha = fecha. } public void setUsuarios(ArrayList <usuario> usuarios) { this. } public void setFecha(Calendar fecha) { this. private ArrayList <usuario> usuarios.usuarios = usuarios.

} } Para el servidor: .getTime().public void date(){ fecha.toLocaleString().

net. public class NewJFrameServer extends javax. import java.ObjectOutputStream.io. import java.ServerSocket.Socket.package distribuidos_socket.JFrame implements Runnable{ .swing. import java.ObjectInputStream.io.io. import java. import java.IOException.net.

ServerSocket serv=null. jButton1 = new javax.swing. btnSalir = new javax. .swing. hilo.swing.swing. jLabel1 = new javax.JButton(). txtMensaje = new javax.JScrollPane().JLabel().swing.JButton(). } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jPanel1 = new javax. Thread hilo=new Thread(this).swing. jScrollPane1 = new javax. public NewJFrameServer() { initComponents().JTextArea().start().JPanel().

ActionEvent evt) { btnSalirActionPerformed(evt).awt.setText("Limpiar"). jButton1.event.setViewportView(txtMensaje). . txtMensaje.WindowConstants. jButton1.setColumns(20).event. txtMensaje.EXIT_ON_CLOSE). jLabel1. 0.awt.awt. btnSalir.event.awt.event.setText("Salir").setFont(new java. } }).swing.awt.addActionListener(new java. 12)).setText("SERVIDOR"). btnSalir.ActionListener() { public void actionPerformed(java.Font("Tahoma".setRows(5).ActionListener() { public void actionPerformed(java. // NOI18N jLabel1.ActionEvent evt) { jButton1ActionPerformed(evt).setDefaultCloseOperation(javax.addActionListener(new java. jScrollPane1.

GroupLayout jPanel1Layout = new javax.createSequentialGroup() .addGap(18. javax.Align ment.createSequentialGroup() .setHorizontalGroup( jPanel1Layout.swing.GroupLayout. 18) .PREFERRED_SIZE.createParallelGroup(javax.LEADING) .GroupLayout(jPanel1).setLayout(jPanel1Layout).swing.addComponent(jScrollPane1.swing.GroupLayout.addGroup(jPanel1Layout.PREFERRED_SIZE) .swing.GroupLayout. 18.addContainerGap() .addGroup(jPanel1Layout. javax.createSequentialGroup() .swing.LEADI NG) . jPanel1Layout.GroupLayout.addComponent(btnSalir)) .addGap(139.swing.} }). 139) 369. 139.addGroup(jPanel1Layout.Alignment.createParallelGroup(javax. jPanel1.addGroup(jPanel1Layout. javax. .

18) .GroupLayout. javax. 25) .createParallelGroup(javax.PREFERRED_SIZE))) . .swing.Align ment.swing.MAX_VALUE)) 249.addGap(18.createSequentialGroup() .Alignment. 18.addGroup(jPanel1Layout.PREFERRED_SIZE.createSequentialGroup() .addComponent(btnSalir) .addComponent(jLabel1)) .addContainerGap(41.GroupLayout. 25.GroupLayout.GroupLayout.MAX_VALUE)) ).swing.addGroup(jPanel1Layout. Short. Short.. javax.TRAILING) .LEADI NG) .addGroup(jPanel1Layout.addComponent(jButton1) . 18.addGap(25.addContainerGap(19. jPanel1Layout. 18) .addGap(18.createParallelGroup(javax.addComponent(jScrollPane1.setVerticalGroup( jPanel1Layout.swing.addComponent(jLabel1) .addComponent(jButton1)) .

addComponent(jPanel1.swing.addContainerGap()) .createParallelGroup(javax.setHorizontalGroup( layout.GroupLayout.createSequentialGroup() .GroupLayout.GroupLayout(getContentPane()).swing.LEADING) . getContentPane().).swing.swing.LEADING) . Short.DEFAULT_SIZE.addGroup(layout. layout.GroupLayout.addContainerGap() .createParallelGroup(javax.createSequentialGroup() .GroupLayout.addGroup(layout.setLayout(layout).GroupLayout layout = new javax.swing.addContainerGap()) ).DEFAULT_SIZE. javax.addContainerGap() .addComponent(jPanel1. Short.Alignment.Alignment. layout.swing. javax.MAX_VALUE) .swing.GroupLayout.MAX_VALUE) . javax.DEFAULT_SIZE.GroupLayout.setVerticalGroup( layout. javax.DEFAULT_SIZE. javax.swing.

awt.ActionEvent evt) { if(evt. } catch (Exception ex) { ex.close().event. pack().printStackTrace(). .setText(null). dispose().getSource()==btnSalir) { try { serv.awt.). }// </editor-fold> private void btnSalirActionPerformed(java.ActionEvent evt) { txtMensaje.event. } } } private void jButton1ActionPerformed(java.

logging.getClassName()). } catch (InstantiationException ex) { . } } } catch (ClassNotFoundException ex) { java. null. ex).log(java .LookAndFeelInfo info : javax.Logger.swing.util. break.html */ try { for (javax.setLookAndFeel(info.UIManager.getName()).getInstalledLookAndFeels()) { if ("Nimbus".util.getName())) { javax.oracle.UIManager. stay with the default look and feel. * For details see http://download.getLogger(NewJFrameServer.Level.swing.swing.UIManager.} public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available.logging.class.com/javase/tutorial/uiswing/lookandfeel/plaf.equals(info.SEVERE.

} // Variables declaration .awt.swing.util.UnsupportedLookAndFeelException ex) { java.swing.class.util.log(java .SEVERE.logging.JButton btnSalir.log(java .getLogger(NewJFrameServer.Logger.Logger.java. ex).Level.logging.util.util. ex).do not modify private javax.Level.getName()).logging.SEVERE.getName()).logging.class.getLogger(NewJFrameServer. null.util.getLogger(NewJFrameServer. } }).setVisible(true).logging. ex).Level.util. . } catch (IllegalAccessException ex) { java.SEVERE.EventQueue.Logger. null.logging. null. } catch (javax. } //</editor-fold> /* Create and display the form */ java.class.invokeLater(new Runnable() { public void run() { new NewJFrameServer().log(java .getName()).

mensaje. ObjectInputStream flujo=new ObjectInputStream(cli.ip.readObject(). private javax.swing.swing.swing. usuario CliObj. Socket cli. .swing.JLabel jLabel1.JTextArea txtMensaje. private javax. // End of variables declaration @Override public void run() { try{ serv= new ServerSocket(9083). String nick.JPanel jPanel1.private javax. private javax.accept(). private javax. nick=CliObj. CliObj=(usuario) flujo.JScrollPane jScrollPane1.swing.getInputStream()).JButton jButton1. while(true){ cli=serv.getNick().

} }catch(IOException | ClassNotFoundException ex){ System.getOutputStream()).close().getMensaje(). cli. mensaje=CliObj. ObjectOutputStream ObjectOutputStream(cliEnvia.getIpUsuario(). Socket cliEnvia=new Socket(ip.append("\n "+nick+" Le dice a: "+ip+"\n Mensaje: "+mensaje).out.writeObject(CliObj).getMessage()).9082).ip=CliObj. } } } flujoEnvia=new . flujoEnvia. txtMensaje.println("Error en servidor"+ex.

Y luego envía al receptor al mismo tiempo el mensaje enviado del receptor sale en su text área (mensaje). la cual se mostrará en el panel del cliente: El gestor para la base de datos que se utilizo fue MysqlWorbench: .

usuario. luego para verificar que los datos fueron almacenados. nos dirigimos a la base de datos. creándose una tabla llamada usuario. dentro de las cuales las columnas son:  IpUsuario varchar(20)  IpRecepcion  Puerto  Nick varchar(20)  Mensaje varchar(244)  Fecha varchar(45) Como en este caso se envió a si mismo sale mensaje enviado y mensaje recibido. .El nombre de la base de datos se llama: chat. realizado en MysqlWorbench y se procederá hacer una consulta: Select * from chat.