Lorsque je crée une 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 le définir sur timeout pour cette socket?
Lorsque je crée le socket, comment puis-je réduire le temps avant que j'obtienne un UnknownHostException
et que le socket expire?
Réponses:
Utilisez plutôt le
Socket()
constructeur et laconnect(SocketAddress endpoint, int timeout)
méthode .Dans votre cas, cela ressemblerait à quelque chose comme:
Socket socket = new Socket(); socket.connect(new InetSocketAddress(ipAddress, port), 1000);
Citant la documentation
la source
socket.setSoTimeout(timeoutMillis)
des délais d'expiration lors du blocage des opérations d'E / S.Vous ne définissez pas de délai pour le socket, vous définissez un délai 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 desread()
opérations.Voir: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
la source
socket.setSoTimeout
doit être appelé APRÈSconnect
, ou il n'aura aucun effet et les lectures ne seront jamais expirées. c'est un piège mal documenté.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 cela aide!
la source
connect()
méthode, mais pas sous le contrôle d'un délai d'attente.Vous ne pouvez pas contrôler le délai en raison de
UnknownHostException
. Ce sont des horaires DNS. Vous ne pouvez contrôler le délai de connexion que pour un hôte valide. Aucune des réponses précédentes n'aborde correctement ce point.Mais j'ai du mal à croire que vous obtenez vraiment 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'expiration DNS de Java, consultez cette réponse .
la source
Utilisez le constructeur par défaut pour Socket, puis utilisez la méthode connect () .
la source