Cliente/Servidor basico

Iniciado por Xedrox, 2 Junio 2014, 23:54 PM

0 Miembros y 1 Visitante están viendo este tema.

Xedrox

Hola gente como va? A ver si me pueden dar una mano con esto porque no doy pie con bola, google no me sirvio de mucho tampoco :S .

Estoy armando un cliente/servidor para posterior uso de manejo remoto, pero ni siquiera lo puedo hacer simplemente en mi pc local. Me baje y compile estos ejemplos:

Codigo del server:

package serverclienttest;

import java.net.*;
import java.io.*;

public class Server
{
    final int PUERTO=5000;
    ServerSocket sc;
    Socket so;
    DataOutputStream salida;
    String mensajeRecibido;

    //SERVIDOR
    public void initServer()
    {
        BufferedReader entrada;

        try
        {
            sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/
            so=new Socket();
       
            System.out.println("Esperando una conexión:");
            so = sc.accept();

            //Inicia el socket, ahora esta esperando una conexión por parte del cliente
            System.out.println("Un cliente se ha conectado.");

            //Canales de entrada y salida de datos
            entrada = new BufferedReader(new InputStreamReader(so.getInputStream()));
            salida = new DataOutputStream(so.getOutputStream());

            System.out.println("Confirmando conexion al cliente....");
            salida.writeUTF("Conexión exitosa...n envia un mensaje :D");

            //Recepcion de mensaje
            mensajeRecibido = entrada.readLine();
            System.out.println(mensajeRecibido);

            salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");
            salida.writeUTF("Gracias por conectarte, adios!");

            System.out.println("Cerrando conexión...");
            sc.close();//Aqui se cierra la conexión con el cliente

        } //try
        catch(Exception e )
        {       
            e.printStackTrace();
            System.out.println("Error: "+e.getMessage());
        } //catch
    } //initServer
} //class


Codigo del cliente:


package serverclienttest;

import java.net.*;
import java.io.*;

public class Client
{

    final String HOST = "localhost";
    final int PUERTO=5000;
    Socket sc;
    DataOutputStream mensaje;
    DataInputStream entrada;

    //Cliente
    public void initClient() /*ejecuta este metodo para correr el cliente */
    {

        try
        {
            sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/
            //creamos el flujo de datos por el que se enviara un mensaje
            mensaje = new DataOutputStream(sc.getOutputStream());

            //enviamos el mensaje
            mensaje.writeUTF("hola que tal!!");

            //cerramos la conexión
            sc.close();
        }
        catch(Exception e )
        {
            System.out.println("Error: "+e.getMessage());
            e.printStackTrace();
        }
    }//initClient
}//class


Al ejecutar el servidor (por medio de initServer) se queda en "Esperando una conexion.." , OK. Al ejecutar el cliente en otra instancia (por medio de initClient) da el siguiente error:


run:
Esperando una conexión:
Un cliente se ha conectado.
Confirmando conexion al cliente....
java.net.SocketException: Software caused connection abort: recv failed
Error: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at serverclienttest.Server.initServer(Server.java:39)
at serverclienttest.ServerClientTest.main(ServerClientTest.java:21)
BUILD SUCCESSFUL (total time: 7 seconds)


Y no se que varia que en otras oportunidades da esto:

run:
run:
Esperando una conexión:
Un cliente se ha conectado.
Confirmando conexion al cliente....
      hola que tal!!
java.net.SocketException: Software caused connection abort: socket write error
Error: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at serverclienttest.Server.initServer(Server.java:42)
at serverclienttest.ServerClientTest.main(ServerClientTest.java:21)
BUILD SUCCESSFUL (total time: 6 seconds)


Por si las dudas uso Netbeans y desactive el firewall de windows para la prueba.

Gracias de antemano.

Saludos!

Nasty35

Para empezar, en el servidor envías:
salida.writeUTF("Conexión exitosa...n envia un mensaje :D");
Y debes hacer luego un:
salida.flush();

En el cliente no veo donde leas esa línea, directamente envías otra:
mensaje.writeUTF("hola que tal!!");

También debes añadir el .flush();

Y luego envías otras dos cadenas, y en el servidor no se leen.

Espero que me entiendas.

Xedrox

Eso me pasa por copiarme ejemplo de blogueros de internet :facepalm to me:

Gracias!