problema con cliente/servidor

      • 89
      • mensajes
      • miembro desde
      • 21/08/04
    19/05/2006
    #1 problema con cliente/servidor

    Hola: Estoy haciendo una aplicacion cliente/servidor en java. Es la primera vez q lo hago sobre este lenguaje. Les cuento como es: tengo un servidor multithread que lanza un thread por cada cliente q se conecta. El problema q tengo es q cuando pruebo con varias cliente al mismo tiempo en disintas pcs, hay mensajes q no llegan, otros q si...o sea hay algo q no anda muy bien...,

    Hay algo q me causa la atencion, Yo estoy usando el eclipse. Para el servidor uso un SOcketServer y un Socket (que me devuleve el accpet) y para el cliente un Socket.

    El problema creo q esta en que el objeto Socket del cliente yo lo declaro asi:
    Socket socket = new Socket(direccionDestino,puertoDestino);

    El tema es q por ej con el eclipse, levanto un sevidor, despues puedo levantar n clientes y andan bien. O sea, en ningun lado le digo al cliente que puerto local (puerto del cliente) tiene que usar. No tendria que tirar bind already in use ???
    o java hace magia y me asigna automaticamente un puerto libre ?
    Tendria que crear el Socket del cliente asi:
    Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
    ??
    Y de esa manera le asigno a cada cliente su puerto local...?

    Bueno, gracias

    Mariano

  1. ¿Este tema te pareció interesante? Compártelo!

    ¿No es lo que buscabas? Intenta buscar un tema similar

    2 comentarios / 7638 Visitas

      • 2,741
      • mensajes
      • miembro desde
      • 15/07/05
    19/05/2006
    #2 Re: problema con cliente/servidor

    Por lo que yo entiendo de java en cuanto a manejo de Sockets y por lo que pude hacer, java tiene dos abstracciones bàsicas para un socket tipo berckley que trabaja sobre TCP/IP (Tambien estan los sockets que envian datagramas, pero nunca los usè).

    Corrijanme si me equivoco pero lo que JAVA hace es lo siguiente:

    Cuando vos instancias un Socket con el constructor Socket(serverURL, serverPort); crea un socket que se conecta a la url del servidor definida por serverURL y se conecta al puerto serverPort. Los puertos locales que usa en este tipo de socket no te interesa, en principio, y creo que JAVA te asigna un puerto libre.

    Tambien tenes los ServerSockets que son Sockets pero ampliados al concepto de servidor, es decir son Sockets que se quedan escuchando peticiones, una vez que una peticion fue recibida y aceptada este SocketServer te devuelve un Socket apuntando a la URL del cliente y el puerto que usa el cliente.

    Es por eso que en principio no te interesa que puerto local te asigno JAVA al Socket, porque en la implementacion del socket servidor JAVA mismo obtiene la URL del cliente y el puerto local del cliente y te crea un socket para que se pueda iniciar una comunicacion punto a punto.

    En principio lo que tenes que tener en cuenta es hacer para el cliente:

    Código:
    Socket socket = new Socket("www.servidor.com",3630);
    
    //Creo un socket que se conecta a www.servidor.com en el puerto 3630, en principio no me interesa que puerto local me asigno JAVA. 
    
    y del lado del servidor haces algo asi:
    ServerSocket serverSocket = new ServerSocket(3630);    //Creo un socket server 
    
    int counter = 0;
    Socket[] socketList = new Socket[5];
    
    while(counter < 5) {
             socketList[counter] = serverSocket.accept();
    }
    
    //Como ves aca espera 5 peticiones el servidor y por cada peticion me genera un socket que se conecta a la url del cliente y el puerto del cliente. Java lo calcula todo es por eso que no te tenes que preocupar por que puerto le asigna java a tu socket cliente ya que no te haria falta manipularlo en ningun momento
    Ahora podemos pedir los streams de entrada y salida para escribir en los sockets y punto.

    Saludos
    PABLO
      • 89
      • mensajes
      • miembro desde
      • 21/08/04
    19/05/2006
    #3 Re: problema con cliente/servidor

    ahh ok. Listo. esta bien, entonces el quilombo lo tengo por otro lado...una pregunta mas, cuando cierro un socket, tambien me cierra los streams q tenga asosiados o tendria q primero cerrar estos y despues el socket ?