2010-08-03 9 views
1

Je rencontre une erreur en dessous lorsque j'essaie de me connecter à un serveur TCP. Mes programmes essaye d'ouvrir environ 300-400 connexions en utilisant des threads différents et cela se passe pendant le 250ème thread. Chaque thread utilise sa propre connexion pour envoyer et recevoir des données.java.net.SocketException La connexion a expiré erreur

java.net.SocketException: Connection timed out:could be due to invalid address 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:372) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:233) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:220) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:385) 

Voici le code que j'ai qu'un thread utilise pour obtenir la prise:

socket = new Socket(my_hostName, my_port); 

est-il une limite par défaut du nombre de connexions qu'un serveur TCP peut avoir à un moment donné? Sinon, comment résoudre ce type de problèmes?

+0

Quelle est la logique sur votre serveur qui gère les connexions? utilisez-vous un pool de threads ou juste générez des threads sauvagement? Si vous utilisez un pool de threads, vous pourriez avoir épuisé les threads si vous ne fermez pas les connexions/finissez la requête. –

+0

Non Je n'utilise pas le pool de threads. Je commence un fil à la fois. Chaque thread ouvre une nouvelle connexion. – jgg

Répondre

5

Vous risquez d'obtenir un délai d'attente de connexion si le serveur possède une ServerSocket liée au port auquel vous vous connectez, mais n'accepte pas la connexion.

Si cela se produit toujours avec la 250ème connexion, le serveur est peut-être configuré pour n'accepter que 250 connexions. Quelqu'un doit se déconnecter pour que vous puissiez vous connecter. Ou vous pouvez augmenter le délai d'expiration; au lieu de créer la douille ainsi, créer la prise avec le constructeur vide, puis utiliser la méthode connect():

Socket s = new Socket(); s.connect(new InetSocketAddress(my_hostName, my_port), 90000);

délai de connexion par défaut est de 30 secondes; le code ci-dessus attend 90 secondes pour se connecter, puis lève l'exception si la connexion ne peut pas être établie.

Vous pouvez également définir un délai d'attente de connexion inférieure et faire autre chose quand vous attrapez cette exception ...

+0

Je vais essayer ça. Merci! – jgg

+0

Non. Vous ne pouvez pas augmenter le délai d'attente de connexion au-delà de la valeur par défaut. Vous ne pouvez que le diminuer. Le code ci-dessus expirera après la période par défaut si elle est inférieure à 90 secondes. Le délai de connexion par défaut varie d'un système à l'autre mais il est de l'ordre d'une minute. – EJP

0

Pourquoi toutes les connexions? Est-ce un programme de test? Dans ce cas, sachez que l'ouverture d'un grand nombre de connexions à partir d'un seul client impose au client des contraintes qui ne sont pas exercées par des systèmes réels avec un grand nombre d'hôtes clients différents. Les résultats de ce type de client ne sont donc pas tout à fait valables . Vous pourriez manquer de ports clients ou d'autres ressources client.

Si ce n'est pas un programme de test, même question. Pourquoi toutes les connexions? Vous feriez mieux d'exécuter un pool de connexions et de réutiliser un nombre beaucoup plus petit de connexions en série. Le réseau a seulement tellement de bande passante après tout; le diviser par 400 n'est pas très utile.

Questions connexes