2013-09-04 4 views
0

클라이언트 - 서버 자바 프로그램을 사용하여 2 대 이상의 컴퓨터를 연결하는 방법에 대해 도움을 받으시겠습니까? 프로그램이 제대로 작동하지 않아서 어려움을 겪고 있습니다. 나는 올바른 IP를 얻었는지 아닌지, 그리고 한 가지 더, 사용되는 컴퓨터가 허브를 통해 연결되어 있는지를 알기 위해 자바에서 일하는 새로운 학생입니다.클라이언트 - 서버 자바 프로그램을 사용하여 2 대의 컴퓨터를 연결하는 방법

누군가 나를 도울 수 있으면 감사하겠습니다.

+0

세부 사항이 필요합니다. 우리가 시도한 것과 실패한 것을 보여주십시오. –

+0

'프로그램이 정상적으로 작동하지 않습니다.'정상적으로 동작하지 않는 코드를 보여줄 수 있습니까? 또한 그것이 어떻게 작동해야하며 실제로 어떻게 작동하는지 설명하십시오. – Pshemo

+0

더 많은 세부 정보가 필요합니다. 적어도 프로그램이 원하는 것을 설명하십시오. – Quillion

답변

0

먼저 program does not work as it should be이라고 말하면서 수행 한 작업에 대한 미리보기를 제공해야합니다.

어쨌든, 당신이하려는 것은 소켓 연결입니다. 또는 적어도 당신이 우리에게 너무 많은 정보를주지 않았다고 생각합니다. 여기

는 socke 클라이언트 - 서버 연결을 달성하기 위해 간단한 예입니다

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

+0

이것은 도움이됩니다. 고마워요 :) – MissJ

+0

@MissJ : 당신은 환영합니다;) 이제 내가 가장 좋은 대답으로 표시해야합니다 그래서 나는 몇 가지 포인트를 적립하실 수 있습니다 : 피 – JGutierrezC

2

클라이언트 :

// 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 

서버 당신의 양 근처에 어디에서 제공하지 않은

// 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 
관련 문제