2017-10-12 11 views
-1

Je suis en train d'initialiser deux DatagramSockets sur les ports adjacents en tant que tels:lier Java DatagramSocket à deux ports ouverts consécutifs

int iport = 5000; 
DatagramSocket sock1 = new DatagramSocket(iport); 
DatagramSocket sock2 = new DatagramSocket(iport + 1); 

Cependant, cela ne fonctionne pas si le port 5000 ou 5001 est indisponible. Je ne me soucie pas des ports que je lie, tant qu'ils satisfont la condition que sock1.getPort() + 1 == sock2.getPort(). Y at-il un moyen facile de trouver deux ports adjacents sans itération sur tous les ports disponibles et en essayant de lier à chacun d'eux jusqu'à ce que je trouve deux qui fonctionnent?

+1

Vous souhaitez probablement choisir des ports qui ne sont pas déjà réservés pour d'autres protocoles: _ [Nom du service et Registre du numéro de port du protocole de transport] (https://www.iana.org/assignments/service-names-port-numbers/service- names-port-numbers.xhtml) _. –

+0

Pourquoi? L'exigence est complètement impraticable. Et si vous ne vous souciez pas de ce qu'ils sont, pourquoi vous souciez-vous qu'ils sont adjacents? Pourquoi avez-vous besoin de deux prises? – EJP

+0

Je communique avec un serveur qui, pour une raison quelconque, envoie des réponses au port un plus élevé que le port que j'ai envoyé. Cela n'a pas beaucoup de sens mais je n'ai pas accès au code du serveur ... – kmell96

Répondre

0

DatagramSocket() laissez OS choisir un port libre pour vous, tandis que DatagramSocket(port) essayez d'obtenir un port spécifique.

Vous pouvez le faire comme ceci:

DatagramSocket sock1 = null; 
DatagramSocket sock2 = null; 

while (sock2 == null) { 
    sock1 = new DatagramSocket(); 
    try { 
     sock2 = new DatagramSocket(sock1.getLocalPort() + 1); 
    } catch (java.net.BindException ex) { 
     sock1.close(); 
    } 
} 

La boucle while est ici parce qu'il ya une très peu de chances que le port de sock1 + 1 a déjà binded être.