Foros del Web » Programación para mayores de 30 ;) » Java »

Duda con cliente/servidor tcp en java

Estas en el tema de Duda con cliente/servidor tcp en java en el foro de Java en Foros del Web. A ver si por favor alguien me puede ayudar con este problema que tengo con cliente/servidor tcp en java. La clase cliente que tengo es ...
  #1 (permalink)  
Antiguo 05/12/2014, 01:33
 
Fecha de Ingreso: diciembre-2014
Ubicación: Albacete
Mensajes: 5
Antigüedad: 9 años, 4 meses
Puntos: 0
Duda con cliente/servidor tcp en java

A ver si por favor alguien me puede ayudar con este problema que tengo con cliente/servidor tcp en java.

La clase cliente que tengo es asi y no la puedo mpdificar:

Código:
class SimpleTCPClient { 
    
    public static void main(String argv[]) throws Exception { 
        String sentence; 
        String modifiedSentence; 
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); 
        Socket clientSocket = new Socket("localhost", 8080); 
        DataOutputStream outToServer = new DataOutputStream( clientSocket.getOutputStream()); 
        BufferedReader inFromServer = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); 
        sentence = inFromUser.readLine(); 
        outToServer.writeBytes(sentence + '\n'); 
        modifiedSentence = inFromServer.readLine(); 
        System.out.println("FROM SERVER: " + modifiedSentence); 
        clientSocket.close(); 
    } // main 
} // SimpleTCPClient class
El servidor lo forman dos clases, una multihilo que hace uso de la siguiente clase para atender los procesos de cliente:

Código:
public class WorkerRunnable implements Runnable{ 
    protected Socket clientSocket = null; 
    protected String serverText = null; 
    public WorkerRunnable(Socket clientSocket,String serverText) 
    { 
        this.clientSocket = clientSocket; 
        this.serverText = serverText; } 
        // WorkerRunnable 
        
    public void run() { 
        try { 
            InputStream input = clientSocket.getInputStream(); 
            OutputStream output = clientSocket.getOutputStream(); 
            long time = System.currentTimeMillis(); 
            output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " + this.serverText + " - " + time + " ").getBytes()); 
            output.close(); input.close(); System.out.println("Request processed: " + time); 
        } catch (IOException e) { e.printStackTrace(); 
                //report exception somewhere 
            } 
    } // run 
} // WorkerRunnable
Pues tengo que modificar esta clase para que su comportamiento sea complementario al del cliente, que lea la cadena de texto enviada por el cliente, y como respuesta reenvíe la cadena leída precedida de la palabra ECHO.

Esta que pongo es la que funciona para ver retardos si como cliente uso el navegador web.

Alguien me puede ayudar por favor?

Muchisimas gracias.
  #2 (permalink)  
Antiguo 05/12/2014, 09:20
 
Fecha de Ingreso: diciembre-2014
Ubicación: Albacete
Mensajes: 5
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Duda con cliente/servidor tcp en java

Decir que entre otras opciones, esta no me da errores, pero tampoco me funciona:

Código:
public class WorkerRunnable implements Runnable{ 
    protected Socket clientSocket = null; 
    protected String serverText = null; 
    public WorkerRunnable(Socket clientSocket,String serverText) 
    { 
        this.clientSocket = clientSocket; 
        this.serverText = serverText; 
    }// WorkerRunnable 
        
    public void run() {
        String mensaje;
        try { 
            
            ObjectInputStream input = new ObjectInputStream(clientSocket.getInputStream()); 
            ObjectOutputStream output = new ObjectOutputStream(clientSocket.getOutputStream()); 
            while(true){
                if((mensaje= (String)input.readObject()) != null){
                    String respuesta ="ECHO: "+ mensaje;
                    output.writeObject(respuesta);
                    System.out.println(mensaje);
                }
                    Thread.sleep(100);
                }
            //System.out.println("Rrespuestaaa respuesta);     
            //output.close(); input.close(); 
        } catch (Exception e) { e.printStackTrace(); 
                //report exception somewhere 
            } 
    } // run 
} // WorkerRunnable
Me conecta pero no puedo mostrar lo que escribo por pantalla...Algun consejo/ayuda por favor??

Gracias!
  #3 (permalink)  
Antiguo 05/12/2014, 10:57
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Duda con cliente/servidor tcp en java

Buenas,

Porque no pones tambien el codigo del main del server? Si ese codigo no podemos ejecutar tu ejemplo.

Bueno... en cualquier caso algo como esto deberia servirte:

Código Java:
Ver original
  1. public class WorkerRunnable implements Runnable {
  2.  
  3.     protected Socket clientSocket = null;
  4.  
  5.     public WorkerRunnable(Socket clientSocket) {
  6.         this.clientSocket = clientSocket;
  7.     }// WorkerRunnable
  8.  
  9.     @Override
  10.     public void run() {
  11.         String mensaje;
  12.         try {
  13.             BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  14.             DataOutputStream output = new DataOutputStream(clientSocket.getOutputStream());
  15.             while (true) {
  16.                 mensaje = input.readLine();
  17.                 output.writeBytes("ECHO: " + mensaje + "\n\r");
  18.                 output.flush();
  19.             }
  20.         } catch (Exception e) {
  21.             e.printStackTrace();
  22.             //report exception somewhere
  23.         }
  24.     } // run
  25. } // WorkerRunnable


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 05/12/2014, 11:05
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda con cliente/servidor tcp en java

Hola:

El cliente no lo puedes modificar. Fíjate que usa DataOutputStream para escribir, con un \n al final y usa BufferedReader para leer, con un readLine(). Un readLine() se queda bloqueado hasta que encuentre una línea completa con un \n al final.

En tu primera versión de servidor usas InputStream y OuptutStream, pero no lees nada (el input lo cierras sin leer) y en el envío no envías un \n, que es lo que espera el cliente con el readLine().

En tu segunda versión, usas ObjectInputStream y ObjectOutputStream. Esas clases son muy específicas de java y sirven para enviar objetos java con un protocolo específico de java y requieren que al otro lado del socket haya esas mismas clases. Cuando envías un String con estas clases, no estás enviando un texto, sino una clase String de java con todos sus atributos y cosas. Olvida completamente esta versión.

O bien usas la primera versión, pero poniendo \n al final de cada línea que envíes, o bien usa los mismos objetos que usa el cliente (BufferedReader y DataOutputStream con \n al final). Para usar DataOuputStream con \n, casi es mejor usar PrintStream, que tiene método println() que ya añade el \n al final, pero puedes usar el que quieras.

Otro detalle para que tengas en cuenta. Si envías algo y cierras el socket inmediatamente después (es lo que estás haciendo), puede que no le des tiempo al otro lado a leerlo (depende de como implemente los sockets el sistema operativo). Para evitar esto, en el socket llama a la opción setsoLinger (ponle a on y un tiempo máximo para dar tiempo al otro lado a leer).

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 05/12/2014 a las 11:15
  #5 (permalink)  
Antiguo 06/12/2014, 04:47
 
Fecha de Ingreso: diciembre-2014
Ubicación: Albacete
Mensajes: 5
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Duda con cliente/servidor tcp en java

Muchisimas gracias por los consejos!! Me han servido mucho, habia cosas que no tenia ni idea. Ya lo tengo solucionado. Menudo descubrimiento de foro, GRACIAS!!!!

Etiquetas: clase, string, tcp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:08.