0

Will someone please help me on how to connect two or more computers using a client-server java program? I am having difficulties because the program does not work as it should be. I am new student working on java so I really don't know if I'm getting the correct IP or not and one more thing, the computers to be used are connected through a hub.

If someone can help me, I'll appreciate it.

4

2 回答 2

2

Client:

// Cliente que lee y muestra la información que le envía un Servidor.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Cliente extends JFrame {
private JTextField campoIntroducir;
private JTextArea areaPantalla;
private ObjectOutputStream salida;
private ObjectInputStream entrada;
private String mensaje = "";
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 conectar este cliente

  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 conexión
  try {
     conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
     obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida
     procesarConexion(); // Paso 3: procesar la conexión
  }

  // el servidor cerró la conexión
  catch ( EOFException excepcionEOF ) {
     System.err.println( "El cliente termino la conexión" );
  }

  // procesar los problemas que pueden ocurrir al comunicarse con el servidor
  catch ( IOException excepcionES ) {
     excepcionES.printStackTrace();
  }

  finally {
     cerrarConexion(); // Paso 4: cerrar la conexión
  }

} // fin del método ejecutarCliente

// conectarse al servidor
private void conectarAServidor() throws IOException
{      
  mostrarMensaje( "Intentando realizar conexión\n" );

  // crear Socket para realizar la conexión con el servidor
  cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );

  // mostrar la información de la conexión
  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(); // vacíar búfer de salida para enviar información de encabezado

  // establecer flujo de entrada para los objetos
  entrada = new ObjectInputStream( cliente.getInputStream() );

  mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
}

// procesar la conexión con el servidor
private void procesarConexion() throws IOException
{
  // habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes
  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" ) );

} // fin del método procesarConexion

// cerrar flujos y socket
private void cerrarConexion() 
{
  mostrarMensaje( "\nCerrando conexión" );
  establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir

  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" );
  }
}

// método utilitario que es llamado desde otros subprocesos para manipular a 
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje( final String mensajeAMostrar )
{
  // mostrar mensaje del subproceso de ejecución de la GUI
  SwingUtilities.invokeLater(
     new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

        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
}

// método utilitario que es llamado desde otros subprocesos para manipular a 
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable( final boolean editable )
{
  // mostrar mensaje del subproceso de ejecución de la GUI
  SwingUtilities.invokeLater(
     new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

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

     }  // fin de la clase interna

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

public static void main( String args[] )
{
  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

Server

// Configurar un servidor que reciba una conexión de un cliente, envíe
// una cadena al cliente y cierre la conexión.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Servidor extends JFrame {
   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 registrar componente de escucha
      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 conexiones
      try {

         // Paso 1: crear un objeto ServerSocket.
         servidor = new ServerSocket( 12345, 100 );

         while ( true ) {

            try {
               esperarConexion(); // Paso 2: esperar una conexión.
               obtenerFlujos();        // Paso 3: obtener flujos de entrada y salida.
               procesarConexion(); // Paso 4: procesar la conexión.
            }

            // procesar excepción EOFException cuando el cliente cierre la conexión 
            catch ( EOFException excepcionEOF ) {
               System.err.println( "El servidor terminó la conexión" );
            }

            finally {
               cerrarConexion();   // Paso 5: cerrar la conexión.
               ++contador;
            }

         } // fin de instrucción while

      } // fin del bloque try

      // procesar problemas con E/S
      catch ( IOException excepcionES ) {
         excepcionES.printStackTrace();
      }

   } // fin del método ejecutarServidor

   // esperar que la conexión llegue, después mostrar información de la conexión
   private void esperarConexion() throws IOException
   {
      mostrarMensaje( "Esperando una conexión\n" );
      conexion = servidor.accept(); // permitir al servidor aceptar la conexión            
      mostrarMensaje( "Conexión " + 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 búfer de salida para enviar información de encabezado

      // establecer flujo de entrada para los objetos
      entrada = new ObjectInputStream( conexion.getInputStream() );

      mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
   }

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

      // habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes
      establecerCampoTextoEditable( true );

      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 cliente
         catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
            mostrarMensaje( "\nSe recibió un tipo de objeto desconocido" );
         }

      } while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) );

   } // fin del método procesarConexion

   // cerrar flujos y socket
   private void cerrarConexion() 
   {
      mostrarMensaje( "\nFinalizando la conexión\n" );
      establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir

      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" );
      }
   }

   // método utilitario que es llamado desde otros subprocesos para manipular a
   // areaPantalla en el subproceso despachador de eventos
   private void mostrarMensaje( final String mensajeAMostrar )
   {
      // mostrar mensaje del subproceso de ejecución despachador de eventos
      SwingUtilities.invokeLater(
         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

            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
   }

   // método utilitario que es llamado desde otros subprocesos para manipular a 
   // campoIntroducir en el subproceso despachador de eventos
   private void establecerCampoTextoEditable( final boolean editable )
   {
      // mostrar mensaje del subproceso de ejecución despachador de eventos
      SwingUtilities.invokeLater(
         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

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

         }  // fin de la clase interna

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

   public static void main( String args[] )
   {
      Servidor aplicacion = new Servidor();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      aplicacion.ejecutarServidor();
   }

}  // fin de la clase Servidor
于 2013-09-04T14:46:15.887 回答
0

You should first give us a preview about what you've done so far as you say program does not work as it should be.

Anyway, what you're trying to do is a socket connection, or at least that's what i think as you didn't give us too much info.

Here is a quick example to achieve socke client-server connection

http://zerioh.tripod.com/ressources/sockets.html

于 2013-09-04T14:41:56.353 回答