2010-11-29 5 views
10

Qui sait comment le port est choisi lorsque j'utilise la méthode accept de la classe ServerSocket? Est-il possible de définir une plage pour les ports que la méthode peut choisir? Puis-je "prendre" les ports un par un juste dans l'ordre?Méthode ServerSocket accept()

ServerSocket sSocket = new ServerSocket(5050); 
Socket socket = sSocket.accept(); 

From the book

+0

Essayez getLocalPort et voyez si c'est vrai. – Codemwnci

+4

Est-ce un bon livre que vous lisez? "simple vieille prise" me semble bizarre. –

+0

Oui, c'est Head First Java, un livre pour les débutants. – Eugene

Répondre

20

Le diagramme est incorrect (et figure dans le unconfirmed errata sur le site O'Reilly).

Le client choisitson port au hasard (vous n'avez pas besoin de faire quoi que ce soit spécial en Java) et se connecte au serveur sur le port selon que vous avez spécifié. En utilisant l'outil de ligne de commande netstat vous pouvez voir cela - d'abord, juste le socket serveur d'écoute sans clients:

 
[email protected]:~$ netstat -n -a 
Active Internet connections (including servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address  (state) 
... 
tcp46  0  0 *.5050     *.*     LISTEN 
... 

(il y a beaucoup d'autres entrées, je viens enlevé les non apparentés)

maintenant, avec 1 client connexion de l'hôte local (127.0.0.1):

 
[email protected]:~$ netstat -n -a 
Active Internet connections (including servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address  (state) 
... 
tcp4  0  0 127.0.0.1.64895  127.0.0.1.5050  ESTABLISHED <- 1 
tcp4  0  0 127.0.0.1.5050   127.0.0.1.64895  ESTABLISHED <- 2 
tcp46  0  0 *.5050     *.*     LISTEN  <- 3 
... 

depuis le client se connecte à partir de la même machine, nous voyons deux connexions établies - un du client au serveur (1), l'autre du serveur au client (2). Ils ont des adresses locales et étrangères opposées (puisqu'ils communiquent entre eux) et vous pouvez voir que la fin du serveur utilise toujours le port 5050 alors que le socket serveur d'origine (3) continue à écouter sur le même port.

(ceux-ci sont de Mac, mais Windows/Linux ont également netstat donnant une sortie similaire)

+0

Merci beaucoup. – Eugene

+0

Salut SimonJ, pourriez-vous s'il vous plaît expliquer pourquoi le côté serveur pourrait utiliser le même port de socket? Merci ! – MrROY

+0

@MROROY Parce que le client choisit son port local au hasard, comme il le dit dans la réponse. – EJP

0

Le ServerSocket définit l'orifice dans le cadre du constructeur. Si vous ne spécifiez pas de port, le socket n'est pas lié (c'est-à-dire inaccessible).

Pour obtenir le port du socket de connexion, utilisez getPort() et non getLocalPort(). Le second vous donnera le port sur votre serveur.

+0

J'ai ajouté une note à ma question. S'il vous plaît jeter un oeil sur la deuxième ligne. Merci – Eugene

+1

Je ne suis pas tout à fait sûr de ce que vous voulez dire. 100 prises connectées à votre serveur se connecteront toutes via le port 5050. Si vous voulez dire le port de la machine qui se connecte à vous, utilisez getPort(). – Codemwnci

0

Vous pouvez passer 0 comme un numéro de port pour créer un socket serveur sur un port libre, ou faire une méthode comme celui-ci pour créer une socket serveur pour un port libre dans la plage donnée:

public java.net.ServerSocket createServerSocket(int rangeStart, int rangeEnd) 
          throws java.io.IOException { 
    for(int port=rangeStart; port<=randeEnd; port++) { 
    try { 
     return new ServerSocket(port); 
    } catch(java.net.BindException be) { 
     // debug/warning here 
     continue; 
    } 
    } 
    throw new java.io.IOException("Failed to create a server socket, all ports between " + 
           rangeStart + " - " + rangeEnd + " are already in use."); 
} 

Le La boucle ne prend pas en charge une autre exception (SecurityException par exemple), mais vous pouvez l'ajouter.

+0

ServerSocket (i)? Vouliez-vous dire: ServerSocket (port)? – Eugene

+0

@AndriodNood sûr, merci, corrigé. – khachik

+0

Cela ne fonctionnera-t-il pas, parce que quand il renvoie d'abord le ServerSocket, il arrête la fonction? – Arin

2

Une connexion TCP se compose de quatre parties:

  • IP Client
  • client Port
  • IP du serveur
  • serveur Port

Il peut y avoir, par exemple, plusieurs clients connecté au même port de serveur - tant que les clients n'ont pas la même adresse IP et le même prt, ça va. Et pour cette partie, le système d'exploitation prend soin.

Donc, c'est tout à fait correct d'écouter juste sur un port.

+0

Merci pour votre clarification. Je viens de télécharger une image du livre, pouvez-vous jeter un oeil s'il vous plaît? – Eugene

+0

@Eugene Oubliez le livre. C'est faux. – EJP

5

Vous choisi le port, quand vous avez dit nouveau ServerSocket (5050). Tout ce truc sur l'utilisation d'un port différent pour le socket accepté est 100% BS.

Questions connexes