2011-12-01 20 views
5

Estoy intentando escribir un programa de subprocesos múltiples en Java donde un servidor escucha las conexiones de los clientes y genera un subproceso para alojar cada cliente. Tengo:Programa de servidor de subprocesos múltiples en Java

while(true) 
    { 
     Socket s = server.accept();  
     ClientHandler ch = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
    } 

Mi pregunta es: cada vez que acepta una conexión en

Socket s = server.accept(); 

y comienza a ejecutar las siguientes líneas de código para crear el hilo, etc., lo que le sucede a una solicitud de conexión desde un cliente durante ese tiempo. ¿Está en cola de alguna manera y se publicará en el siguiente ciclo de while(true) o será rechazado?

gracias, Nikos

Respuesta

4

Después de las declaraciones de accept() el protocolo de enlace TCP es completa y tiene un socket de cliente conectado (s en su código). Hasta la siguiente llamada al accept(), el SO pone en cola las solicitudes de conexión pendientes.

Es posible que desee ver algunos tutoriales como this one, por ejemplo.

0

Como ya se contestó: sí está en cola y no es rechazado.

creo que cualquiera que lea esta pregunta primero debe saber que cuando se instancia un socket:

server = new ServerSocket(mPort, mNusers); 

Java ya está implementando un network socket; que tiene un comportamiento claramente definido. Sin embargo, la conexión será rechazada después de alcanzar el límite establecido.

también, el código publicado en la pregunta acepta varias conexiones pero pierde el refference para el anterior. Esto puede ser un "duh", pero por si alguien está copiando y pegando, debe hacer algo para almacenar todos los sockets o manipuladores creados. Tal vez:

ClientHandler[] ch = new ClientHandler[mNusers]; 
int chIndex = 0; 
while(true) 
    { 
     Socket s = server.accept();  
     ch[chIndex] = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
     chIndex++; 
    } 

una matriz puede no ser la mejor opción, pero quiero señalar que con tomas que debe saber cuál es el límite de conexiones que va a destinar

1

me escribió a tiny http server en Java, que se puede encontrar en github. Ese podría ser un buen ejemplo para echar un vistazo al uso de Sockets y multihilo en el mundo real.

0

uf :)

hay una llamada SYN-cola, que lleva hasta la cantidad solicitada de conexiones no establecidas aún (hay una por cada llamada y un límite para todo el sistema - no estoy seguro si es incluso usuario limitado).

al "escuchar" en un ServerSocket, especifique que por - una de las respuestas dice "Nusers" pero es - el tamaño del "backlog" que debe mantener el socket. en este backlog las conexiones pendientes se almacenan y si se completa, todas las demás (deberían) obtener una ConnectionRefused.

Así

a) Aumentar que cuando usted está aceptando lentamente a (servidor.accept()) conexiones

b) aceptar las conexiones más rápidas por

b.1) usando un ThreadPool (ser feliz en movimiento el problema de contexto-interruptores del sistema operativo)

b.2) utilizar NIO y con ello la capacidad de manejar socket estados- dentro de hilos individuales/CPUs (siempre que el caudal de datos interno es mejor que la de la red, esta es la opción más performant)

divertirse

Cuestiones relacionadas