Java - Limitar clientes que se conectar por socket, cola de espera

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Limitar clientes que se conectar por socket, cola de espera

Publicado por Santiago (4 intervenciones) el 28/09/2019 18:36:47
Estoy intentando averiguar cómo limitar el números de conexiones por socket entrantes, a un programa que hace las veces de servidor http (muy simple).

La idea es que si asigno una cola de 5 conexiones, el 6º que se conecta tiene que esperar a que uno de los 5 primeros termine.

Y no consigo que me pare en el proceso nº6.

He probado de todo por ejemplo con Executor que se supone que puede limitar la cola. Pero nolo hace o no se hacerlo yo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ExecutorService executorService = Executors.newFixedThreadPool(5);
 
 
for(;;) // bucle infinito para crear los hijos (multihilo)
{
 
    Socket skCliente = skServidor.accept(); // Crea objeto
    System.out.println("Sirviendo cliente...");
 
    Runnable t = new Hilo(skCliente);
    //new Thread(t).start();
 
    executorService.submit(t);
    //executorService.submit(new Hilo(skCliente)  );
 
    // Thread t = new Hilo(skCliente);
    // t.start();
 
 
}

MIl gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Limitar clientes que se conectar por socket, cola de espera

Publicado por Tom (1831 intervenciones) el 28/09/2019 19:50:07
Poner la conexión entrante "en espera" no es trivial. Te recomendaría que, simplemente, no aceptaras la conexión.
Si dejas la petición entrante en el "backlog" https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html#ServerSocket(int,%20int) el cliente dará por cancelado el intento de conexión después de un tiempo.
Si quieres aceptar la conexión, pero no hacerle caso, créate una cola de sockets conectados (https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html), pero no se los pases al Hilo hasta que te convenga.

En definitiva, lo mejor es que pongas un contador y si hay 5 hilos creados cierres el skCliente.

Y, por cierto, lo que has pegado debe funcionar. El executor acepta Runnables pero no los ejecuta hasta que otro no quede libre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Limitar clientes que se conectar por socket, cola de espera

Publicado por Santi (4 intervenciones) el 28/09/2019 23:53:35
Gracias por tu ayuda a ver si me aclaro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Limitar clientes que se conectar por socket, cola de espera

Publicado por Santiago (4 intervenciones) el 29/09/2019 12:45:46
Sobre la idea de las colas me parece genial, algo así quería hacer pero ¿como se entera el padre que un hijo a muerto para sacarlo de la cola?.

Padre crea cola con hijos Runneable—— el hijo muere y padre avanza la cola.

De hecho si simplemente supiera como comprobar que un hijo a muerto o el numero de hijos activos podría valer con eso.

También estoy intentando que me diga numero de hilos en activo y controlarlo así, pero ejecuto desde varios terminales el cliente y me da números activos de hilos que no tienen sentido para mi.

Un mismo cliente me genera hasta 3 hilos (al repetir que lea un fichero en cada lectura crea y que abre un socket nuevo, porque usar el mismo socket da error EOF... ni idea de porque).

Curiosamente me dice que tengo hasta 3 Hilos, a partir de ahí por muchas veces que repita el proceso de lectura del fichero, no me dice que tenga mas de 3.

El caso es que abro en terminal 2-3 clientes mas y me sigue diciendo 3 hilos abiertos.

Adjunto los ficheros fuente.

mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Limitar clientes que se conectar por socket, cola de espera

Publicado por Tom (1831 intervenciones) el 29/09/2019 18:41:21
Tu código debería funcionar. Solamente dos hilos estarán activos al mismo tiempo.
Si sospechas que falla, haz algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Hilo implements Runnable {
	static int counter = 0;
 
	private Socket skCliente;
...
	@Override
	public void run() {
		int resultado = 0;
		String line = "";
		String rootpath = "docs";
 
		System.out.printf("Service thread %d starting\n", incCounter(1));
		try {
...
		} catch(Exception e) {
			System.out.println("Error: " + e.toString());
		} finally {
			incCounter(-1);
		}
	}
...
 
	/* */
	synchronized static int incCounter(int inc) {
		counter += inc;
		return counter;
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Limitar clientes que se conectar por socket, cola de espera

Publicado por Santi (4 intervenciones) el 29/09/2019 20:24:25
He pedido ayuda a un amigo y lo hemos hecho igual que este último ejemplo tuyo, con un contador de conexiones. La misma idea.

Mil gracias de verdad por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar