2012-12-30 7 views
5

In der Server-Seite, verwende ich diesen Code:Warum Java ServerSocket accept() gibt einen Socket mit dem gleichen Port wie ServerSocket zurück?

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

ich den Server auf Port 1234.

Wenn ein oder mehr Client-Buchsen angeschlossen sind, werden sie alle das gleich Port 1234 gefunden !

Das ist wirklich verwirrend ist:

enter image description here

Ich erinnere mich, dass Multi-Buchsen nicht den gleichen Port verwenden können, ist es nicht wahr? Vielen Dank.

+6

Warum nicht? Lesen Sie, wie TCP funktioniert. –

+1

Die einfache Antwort, die Sie suchen, ist, dass Sie das LISTEN auf der rechten Seite nicht bemerkt haben. Es ist nur eins. –

+0

aber die Methode accept gibt zwei Sockets zurück, sie verwenden den gleichen Port bei 127.0.0.1, ist es richtig? – MrROY

Antwort

11

Eine TCP-Verbindung wird durch vier Zahlen identifiziert:

  • Client (oder Peer-1) IP
  • Server (oder Peer 2) IP
  • Client-Port
  • Server-Port
Eine typische TCP-Verbindung ist wie folgt geöffnet:
  • Die Client-IP wird vom ISP oder NAT des Clients angegeben.
  • Die Server-IP wird vom Benutzer angegeben oder in einem DNS nachgeschlagen.
  • Der Client wählt einen Port willkürlich aus dem nicht zugewiesenen Bereich (unter Vermeidung von doppelten Quadrupeln)
  • Der Server-Port ist durch das Protokoll oder explizit angegeben.
  • Der Port, den Sie im ServerSocket angeben, ist der, zu dem die Clients eine Verbindung herstellen. Es ist nichts anderes als eine Portnummer, die dem Betriebssystem bekannt ist und zu Ihrer Anwendung gehört, sowie ein Objekt, das die Ereignisse vom Betriebssystem an Ihre Anwendung übergibt.

    Die Methode ServerSocket#accept gibt eine Socket zurück. Ein Socket ist ein Objekt, das eine einzelne TCP-Verbindung umschließt. Das heißt, den Client-IP, den Server-IP, den Client-TCP-Port und den Server-TCP-Port (und einige Methoden, um die damit verbundenen Daten laufen um)

    Das erste TCP-Paket, das der Client sendet must den Server-Port enthält, dass Ihre App zuhört, sonst würde das Betriebssystem nicht wissen, zu welcher Anwendung die Verbindung gehört.

    Weiter gibt es keinen Anreiz, den TCP-Port des Servers zu einer anderen Nummer zu wechseln.Es hilft dem Server-Rechner ODER dem Client-Rechner nicht, es benötigt etwas Overhead (Sie müssen den neuen und den alten TCP-Port zusammen senden), und es gibt zusätzlichen Aufwand, da das Server-Betriebssystem die Anwendung nicht mehr identifizieren kann ein einzelner Port - es muss die Anwendung mit allen Server-Ports verwendet es assoziieren (die Clients muss noch, es zu tun, aber ein typischer Kunde hat weniger Verbindungen als ein typischer Server)


    Was Sie sehen, ist

    • zwei eingehende Verbindungen, die zum Server gehören (lokaler Port: 1234). Jeder hat seine eigene Socket in der Server-Anwendung.
    • zwei ausgehende Verbindungen, die zum Client gehören (Remote-Port: 1234). Jeder hat seine eigene Socket in der Client-Anwendung.
    • eine hörende Verbindung, die zum Server gehört. Dies entspricht der einzelnen ServerSocket, die Verbindungen akzeptiert.
    • Da es sich um Loopback-Verbindungen handelt, können Sie beide Endpunkte auf einer einzelnen Maschine zusammengemischt sehen. Sie können auch zwei verschiedene Client-Ports (52506 und 52511) sowohl auf der lokalen Seite als auch auf der Remote-Seite sehen.

    +1

    Sind die beiden 127.0.0.1.1234 in meinem Bild die gleiche Buchse? – MrROY

    +0

    @MrROY sie sind anders 'Socket's (beachten Sie, dass der andere Port in jedem anders ist), die aus dem gleichen 'ServerSocket' kamen –

    +0

    danke! Meinst du, diese zwei (oder mehr) Sockets vom gleichen ServerSocket könnten (oder müssen) den gleichen Port benutzen? – MrROY

    Verwandte Themen