2010-09-16 11 views
11

Quando si utilizza una classe Socket uno sta stabilendo una connessione TCP a un server su alcune porte, ma sul server ServerSocket è in grado di gestire più connessioni client per ogni richiesta di accettazione e delegarlo a un thread per eseguire il server della richiesta. Ma come è possibile che una classe ServerSocket accetti più connessioni TCP sulla stessa porta.In che modo la classe serversocket serve più connessioni client sulla stessa porta?

Significa che spetta al sistema operativo decidere quante connessioni consente o qual è il limite massimo consentito e può essere controllato dalle applicazioni su OS (intendo java limitato dal massimo backlog supportato da Sistema operativo) e c'è qualche privison per le connessioni backlog nelle specifiche TCP?

migliori reagards,
Keshav

+0

Vedi esempio [questa risposta] (http://stackoverflow.com/questions/3638953/do-tcp-connections-get-moved-to-another-port-after-the-are-opened/3639017#3639017) su Stackoverflow. –

risposta

8

Una connessione TCP è definito da un unico insieme di (IP sorgente, porta sorgente, IP dest, porta di destinazione). Poiché il server si collega a una particolare porta, definisce due di queste 4 variabili. Finché i client provengono tutti da diversi IP e/o porte differenti, non sarà un problema.

E sì, il sistema operativo può controllare quante connessioni totali sono consentite e il programma può limitarlo ulteriormente.

+0

Significa che potremmo effettivamente avere connessioni * illimitate * e non solo 65k? – Pacerier

+0

Non illimitato, ma le interruzioni per IP/sport/dport non sono il fattore limitante. – zigdon

+0

È vero che un computer che tenta di connettersi a se stesso può avere un limite teorico di 65536 * 65536 = 4294967296 connessioni a se stesso? Oppure ho rovinato i miei calcoli .. – Pacerier

-1

Il sistema operativo su cui viene eseguito il server utilizza il numero di porta remoto per distinguere tra le varie connessioni al server.

+0

Usa la 4-tupla. – EJP

3

Serve più client e puoi scegliere quanti client gestirai nello stesso momento.

Una connessione (aka un Socket tra un client e un server non è solo identificato dal IPServer/ServerPort, è identificato con ClientIP/ClientPort/IPServer/ServerPort.

Devi solo accettare le connessioni (e di solito li trattano in diversi thread).


per impostazione predefinita la dimensione arretrato è di 50, ma è possibile impostare quando si crea il tuo ServerSocket.

new ServerSocket(21, 100); //Create a server socket with a backlog of 100 

Risorse:

+0

Non penso che tu possa controllare il 'backlog', puoi specificarlo ma non puoi controllarlo, se pensi di poterlo fare e il secondo argomento del costruttore funziona allora puoi dare un'occhiata a questa mia domanda - http : // StackOverflow.com/domande/41309474/dover-problema-con-test-backlog-as-per-serversocketint-port-int-backlog – hagrawal

Problemi correlati