web-dev-qa-db-fra.com

Définition d'un délai d'attente pour les opérations de socket

Quand je crée un socket:

Socket socket = new Socket(ipAddress, port);

Il lève une exception, ce qui est OK, car l'adresse IP n'est pas disponible. (Les variables de test où String ipAddress = "192.168.0.3" et int port = 300.)

Le problème est le suivant: comment définir le délai d'expiration pour ce socket?

Quand je crée le socket, comment puis-je réduire le temps avant d'obtenir un UnknownHostException et d'obtenir le délai d'expiration du socket?

82
Jennifer

Utilisez la méthode Socket()) et méthode connect(SocketAddress endpoint, int timeout) .

Dans votre cas, cela ressemblerait à quelque chose comme:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

Citant de la documentation

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

Connecte ce socket au serveur avec une valeur de délai d'expiration spécifiée. Une temporisation de zéro est interprétée comme une temporisation infinie. La connexion sera alors bloquée jusqu'à ce qu'elle soit établie ou qu'une erreur survienne.

Paramètres:

endpoint - le SocketAddress
timeout - la valeur de délai d'attente à utiliser en millisecondes.

Lance:

IOException - si une erreur survient pendant la connexion
SocketTimeoutException - si le délai d'attente expire avant la connexion
IllegalBlockingModeException - si ce socket a un canal associé et que le canal est en mode non bloquant
IllegalArgumentException - si le noeud final est null ou s'il s'agit d'une sous-classe SocketAddress non prise en charge par ce socket

Depuis: 1.4

155
aioobe

Vous ne définissez pas de délai d'expiration pour le socket, vous définissez un délai d'expiration pour les opérations que vous effectuez sur ce socket.

Par exemple, socket.connect(otherAddress, timeout)

Ou socket.setSoTimeout(timeout) pour définir un délai d'expiration pour les opérations read().

Voir: http://docs.Oracle.com/javase/7/docs/api/Java/net/Socket.html

41
payne

Vous pouvez utiliser la solution suivante:

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

J'espère que ça aide!

18
reef

Vous ne pouvez pas contrôler le délai d'attente en raison de UnknownHostException. Ce sont des timings DNS. Vous pouvez uniquement contrôler le délai de connexion avec un hôte valide. Aucune des réponses précédentes n'aborde ce point correctement.

Mais j'ai du mal à croire que vous obtenez réellement un UnknownHostException lorsque vous spécifiez une adresse IP plutôt qu'un nom d'hôte.

[~ # ~] edit [~ # ~] Pour contrôler les délais d’exécution du DNS de Java voir cette réponse .

8
user207421

Utilisez le constructeur par défaut pour Socket, puis utilisez la méthode connect () .

5
Sjoerd