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

concepto de sockets en java

Estas en el tema de concepto de sockets en java en el foro de Java en Foros del Web. Hola a todos. Mi pregunta es la siguiente: Tengo un servidor implementado en java que lo que hace es escuchar de un socket peticiones de ...
  #1 (permalink)  
Antiguo 25/10/2007, 03:55
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 1 mes
Puntos: 7
Sonrisa concepto de sockets en java

Hola a todos. Mi pregunta es la siguiente:

Tengo un servidor implementado en java que lo que hace es escuchar de un socket peticiones de los clientes. Ejemplo:

while(true){

cliente.servidor=cliente.serverSocket.accept();
----------------------------------------------------------
----------------------------------------------------------

}


Lo que hago es que cada petición recibida por el socket es atendida por un hilo diferente (el código no lo he puesto).

Mi duda está en que una de esas peticiones que se recibe es para recibir un fichero. No tengo muy claro si el proceso principal (el que escucha por el socket de peticiones) se verá colapsado por esa peticion influyendo entonces en el tratamiento del resto de peticiones ya que nose si el proceso padre (el que está a la escucha de peticiones y luego los hilos que voy creando para tratar dichas peticiones y que trabajan por otros sockets creados al llamarse a la función accept () utilizan el mismo puerto.

Nose si para esa peticion de recibir ficheros es mejor crear una especie de protocolo donde el proceso servidor le pase al cliente un numero de puerto por donde ahora debe pasarle el fichero, diferente al que está utilizando para recibir peticiones de los clientes.


Nose si me explique bien. Mi duda es que nose si todos los sockets que se están abriendo al realizar la llamada accept() trabajan todos por el mismo puerto y entonces se "pegan" unos con otros y para peticiones como recibir ficheros que "son mas pesadas" es mejor que el proceso hilo que tratará dicha petición trabaje por otro puerto para no influir en el rendimiento del resto de procesos??????????

Espero que se me halla entendido un poco.
  #2 (permalink)  
Antiguo 25/10/2007, 05:35
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: concepto de sockets en java

Para trabajar con sockets que no se bloqueen esperando de otros usuarios etc. Java introdujo en el JDK1.4 los sockets no-bloqueantes (Java NIO) que quiza te ayuden.

Alguna bibliografia:
http://www.javahispano.org/contenido...et_y_java_nio/
http://www.onjava.com/pub/a/onjava/2002/09/04/nio.html
http://www.onjava.com/pub/a/onjava/2004/09/01/nio.html

S!
  #3 (permalink)  
Antiguo 25/10/2007, 09:36
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 1 mes
Puntos: 7
Re: concepto de sockets en java

Muchas gracias GreenEyed por responder.

He estado leyendo los enlaces que has puesto.

Realmente yo quiero que mi servidor se quede bloqueado hasta recibir una petición. Mi duda está está en que no tengo muy claro el concepto de si cuando recibo una petición y lanzo un hilo q cubra esa petición con el socket que me devuelve la llamada "accept()", estoy utilizando el mismo puerto que el proceso principal que es el que se queda siempre esperando la llegada de peticiones.

Ahora mismo, como tengo el programa hecho, el servidor una vez que recibe una petición, lanza un hilo para servir dicha petición con el socket que le devuelve el método accept() y otra vez el servidor vuelve a quedarse en la espera de nuevas peticiones

Pero....si ese hilo lanzado está sirviendo una petición de recibir un fichero muy grande por ese socket devuelvo por la función accept(), esa carga de trabajo influye en el resto de hilos que se estén tambien ejecutando o en el futuro puedan ser lanzados?????

Todos los sockets que se van creando con la función accept() trabajan con el mismo puerto y esto repercute en el rendimiento????

Eso es lo que no tengo nada claro.


Saludos.
  #4 (permalink)  
Antiguo 25/10/2007, 13:22
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: concepto de sockets en java

Si no me equivoco no es así, ya que el socket de un servidor es especial y básicamente es para escuchar. Así que si lanzas un Thread distinto para cada cliente no deberias tener "muchos problema"*. Pero por si acaso me confundo (hace tiempo que no programo sockets a tan bajo nivel) la prueba es facil: Pon que uno de tus clientes haga un Thread.sleep de 30 segundos y prueba a lanzar varios clientes a la vez, a ver si pueden conectarse o no.



Claro que en la realidad si el trafico es intenso, no es bueno lanzar un Thread por cliente, ya que podrias tener demasiados Threads y lo suyo es tener un numero de Threads controlado (pool) que atiende a varios clientes. Y ahi es donde entra Java NIO.

S!
  #5 (permalink)  
Antiguo 26/10/2007, 13:08
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Re: concepto de sockets en java

Hola:

El puerto de escucha por el que se hace accept() es uno concreto -el que tu hayas puesto al crear el ServerSocket-. Cada cliente que recibies como respuesta del accept() tiene un puerto distinto que es dinámico, es decir, no tiene nada que ver con el número que hayas puesto en el puerto de escucha y cada vez puede ser uno distinto.

Dicho de otra forma, tienes tantos puertos abiertos como clientes, más uno de escucha. El comando netstat te permitirá ver todos estos puertos.

Si pones un hilo distinto para atender a cada cliente y otro para escucha, no deberías tener ningún problema ni influir unos en otros de ninguna manera -salvo que uno haga excesivo consumo de cpu o de tráfico de red-.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
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 08:17.