2012-12-30 8 views
5

Nel lato server, io uso questo codice:Perché Java ServerSocket accept() restituisce un socket con la stessa porta di ServerSocket?

ServerSocket server = new ServerSocket(1234); 
Socket server_socket = server.accept(); 

ho trovato il server è in ascolto sulla porta 1234.

Se sono collegati uno o più socket client, sono tutti utilizzano la stessa porta 1234 !

che in realtà è confusa:

enter image description here

ricordo che prese multiple non possono utilizzare la stessa porta, non è giusto? Grazie.

collegamento
+6

Perché non è vero? Leggi su come funziona TCP. –

+1

La semplice risposta che stai cercando è che non hai notato il LISTEN sulla destra .. è solo uno. –

+0

ma il metodo accept restituisce due socket, stanno utilizzando la stessa porta su 127.0.0.1, giusto? – MrROY

risposta

11

TCP è identificata da quattro numeri:

  • cliente (o peer 1) IP
  • del server (o peer 2) IP
  • porta del client
  • porta del server

Una connessione TCP tipica è aperta come segue:

  • L'IP del client viene fornito dall'ISP o dal NAT del client.
  • L'IP del server viene fornito dall'utente o cercato in un DNS.
  • Il client sceglie una porta arbitrariamente dall'intervallo non assegnato (evitando i quadrupli duplicati)
  • La porta del server viene fornita dal protocollo o esplicitamente.

La porta specificata nel ServerSocket è quella a cui i client si connettono. Non è altro che un numero di porta che il sistema operativo sa che appartiene alla tua applicazione e un oggetto che passa gli eventi dal sistema operativo alla tua applicazione.

Il metodo ServerSocket#accept restituisce un Socket. Un socket è un oggetto che racchiude una singola connessione TCP. Cioè l'IP del client, l'IP del server, la porta TCP del client e la porta TCP del server (e alcuni metodi per passare i dati associati)

Il primo pacchetto TCP che il client invia deve contenere contiene la porta del server che la tua app sia in ascolto, altrimenti il ​​sistema operativo non saprebbe a quale applicazione appartiene la connessione.

Inoltre, non vi è alcun incentivo per passare la porta TCP del server a un altro numero.Non aiuta la macchina server O la macchina client, ha bisogno di un po 'di overhead da eseguire (è necessario inviare la nuova e la vecchia porta TCP insieme), e c'è un sovraccarico aggiuntivo, dal momento che il sistema operativo del server non può più identificare l'applicazione una singola porta - ha bisogno di associare l'applicazione con tutte le porte del server che utilizza (i client deve ancora farlo, ma un tipico cliente ha meno connessioni rispetto a un tipico server)


quello che vedi è

  • due connessioni in entrata, appartenenti al server (porta locale: 1234). Ciascuno ha il proprio Socket nell'applicazione server.
  • due connessioni esterne, appartenenti al client (porta remota: 1234). Ciascuno ha il proprio Socket nell'applicazione client.
  • un ascolto di connessione, appartenente al server. Questo corrisponde al singolo ServerSocket che accetta le connessioni.

Poiché sono connessioni di loopback, è possibile vedere i due endpoint miscelati insieme su una singola macchina. È inoltre possibile visualizzare due porte client distinte (52506 e 52511), sia sul lato locale che sul lato remoto.

+1

I due 127.0.0.1.1234 nella mia immagine sono dello stesso socket? – MrROY

+0

@MrROY sono diversi 'Socket's (nota l'altra porta è diversa in ciascuno) che proviene dallo stesso' ServerSocket' –

+0

grazie! Vuoi dire che questi due (o più) socket dello stesso ServerSocket potrebbero (o devono) usare la stessa porta? – MrROY