2011-12-01 20 views
5

Sto provando a scrivere un programma multithread in Java in cui un server ascolta le connessioni dai client e genera un thread per facilitare ciascun client. Ho:Programma server multithread in Java

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

mia domanda è: ogni volta che accetta una connessione in

Socket s = server.accept(); 

e inizia ad eseguire le seguenti righe di codice per creare il filo ecc, cosa accade ad una richiesta di connessione da un cliente durante quel tempo. È in qualche modo in coda e verrà visualizzato nel ciclo successivo di while(true) o verrà rifiutato?

grazie, Nikos

risposta

4

Dopo le accept() restituisce l'handshake TCP è completo e si dispone di una presa di client connesso (s nel codice). Fino alla prossima chiamata a accept() il sistema operativo accoda le richieste di connessione in sospeso.

Si potrebbe voler controllare alcuni tutorial come this one per esempio.

0

Come è già stato risposto: sì è in coda e no non è respinto.

Penso che chiunque legga questa domanda deve prima sapere che quando si crea un'istanza di una presa di corrente:

server = new ServerSocket(mPort, mNusers); 

Java sta già attuando un network socket; che ha un comportamento chiaramente definito. La connessione verrà rifiutata comunque dopo aver raggiunto il limite impostato.

Inoltre, il codice scritto in questione accetta connessioni multiple ma perde la refference per il precedente. Potrebbe trattarsi di un "duh", ma nel caso qualcuno stia copiando la copia, dovresti fare qualcosa per memorizzare tutti i socket o i gestori creati. Forse:

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++; 
    } 

Un array potrebbe non essere l'opzione migliore, ma voglio sottolineare che con gli zoccoli si dovrebbe sapere qual è il limite di connessioni si allocare

1

ho scritto a tiny http server in Java, che è possibile trova su github. Potrebbe essere un buon esempio per dare un'occhiata all'utilizzo di socket e multithreading nel mondo reale.

0

ugh :)

v'è una cosiddetta SYN-coda, che prende fino all'importo richiesto di non le connessioni ancora stabilite (c'è una per chiamata e un limite a livello di sistema - non so se la sua ancora utente limitato).

quando "ascolto" su un ServerSocket, si specifica che - una delle risposte dice "Nusers" ma è - la dimensione del "backlog" che il socket deve conservare. in questo backlog vengono archiviate le connessioni in sospeso e, se è piena, tutte le altre (dovrebbero) ottenere una ConnectionRefused.

Così

a) aumentare che quando si è ad accettare lentamente (server.accept()) connessioni

b) accettare le connessioni più veloci da

b.1) utilizzando un ThreadPool (essere felici di spostare il problema al contesto-switch del sistema operativo)

b.2) utilizzare NIO e con ciò la capacità di gestire alveoli stati all'interno dei singoli fili/CPU (finché il throughput dati interna è migliore di quella di rete, questa è l'opzione più performante)

divertirsi