NIO client donnant exception : java.net.ConnectException: Connexion refusée: pas d'autres informations

J'ai modifié l'exemple de code disponible ici pour le Client et le Serveur
Mon client :

public class Client {
public static void main(String[] args) {
int n=10000;
SocketTest [] st= new SocketTest[n];
for(int i=0;i<n;i++)
st[i]= new SocketTest("hi");
for(int i=0;i<n;i++)
new Thread(st[i]).start();
}
}
class SocketTest implements Runnable {
private String message = "";
private Selector selector;
private int i;
public SocketTest(String message){
this.message = message;
}
@Override
public void run() {
SocketChannel channel;
try {
selector = Selector.open();
channel = SocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_CONNECT);
channel.connect(new InetSocketAddress("127.0.0.1", 8511));
while (!Thread.currentThread().isInterrupted()){
selector.select();
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()){
SelectionKey key = keys.next();
keys.remove();
if (!key.isValid()) continue;
if (key.isConnectable()){                           
connect(key);
System.out.println("I am connected to the server");
}   
if (key.isWritable()){
write(key);
}
if (key.isReadable()){
read(key);
}
}   
}
} catch (IOException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} finally {
close();
}
}
private void close(){
try {
selector.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
private void read (SelectionKey key) throws IOException {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1000);
readBuffer.clear();
int length;
try{
length = channel.read(readBuffer);
} catch (IOException e){
System.out.println("Reading problem, closing connection");
key.cancel();
channel.close();
return;
}
if (length == -1){
System.out.println("Nothing was read from server");
channel.close();
key.cancel();
return;
}
readBuffer.flip();
byte[] buff = new byte[1024];
readBuffer.get(buff, 0, length);
//length=buff.length;
String fromserver = new String(buff,0,length,"UTF-8");
length = fromserver.length();
System.out.println("Server said: "+fromserver);
key.interestOps(SelectionKey.OP_WRITE);
}
private void write(SelectionKey key) throws IOException {
SocketChannel channel = (SocketChannel) key.channel();
i++;
message = "location now "+i;
try{
Thread.sleep(5000);
}
catch(InterruptedException ie)
{
System.out.println(""+ie);
}
channel.write(ByteBuffer.wrap(message.getBytes()));
//lets get ready to read.
key.interestOps(SelectionKey.OP_READ);
}
private void connect(SelectionKey key) throws IOException {
SocketChannel channel = (SocketChannel) key.channel();
try
{
if(!channel.finishConnect())
System.out.println("* Here *");
}
catch(ConnectException e)
{
System.out.println("BP 1");
e.printStackTrace();
//channel.close();
//key.cancel();
//return;
}
/*if (channel.isConnectionPending()){
while(!channel.ffinishConnect()){
System.out.println("not connected");
}
}*/
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_WRITE);
}
}

- Je créer plusieurs clients sur la même machine par la création de plusieurs threads.
Pas de threads sont déterminés par la valeur de n.
Quand je lance des petits pas de clients, je rencontre pas de problème mais dès que je lance avec n 500, c'est à dire 500 clients threads , certains threads s'exécutent correctement, mais dans certains, je rencontre ce :
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at SocketTest.connect(Client.java:143)
at SocketTest.run(Client.java:61)

Ligne 143 est :
if(!channel.finishConnect())
Donc quand j'ai lu la documentation de cette méthode qu'il dit qu'il en jette :

NoConnectionPendingException - Si ce canal n'est pas connecté et une opération de raccordement n'a pas été initiée.

ClosedChannelException - Si ce canal est fermé.

AsynchronousCloseException - Si un autre thread ferme cette chaîne alors que l'opération de connexion est en cours.

ClosedByInterruptException - Si un autre thread interrompt le thread en cours alors que l'opération de connexion est en cours, fermant ainsi le canal et le réglage de la thread en cours d'interruption du statut.

IOException - Si une autre erreur d'e/S se produit.

Mais l'Exception est ConnectException.
J'ai essayé de l'attraper mais il n'est pas aller dans le bloc catch.

Toute aide sera appréciée. Merci.
EDIT :
Je travaille sur windows.
J'ai essayé de changer la valeur de n voir combien de clients ont été créés et combien causé des exceptions et ce sont les résultats(je sais que l'attente pour plus de temps après chaque test permettra pour plus d'ouvrir des sockets comme après chaque test scokets sera publié après TIME_WAIT ) :

n clients connected(by keeping a count at server)
1000 522
2000 568
3000 626
4000 600 (maybe I gave less time before successive runs)
5000 1345
6000 1389

Je suis problemed par la façon dont peut seulement ces nombreux clients de se connecter.
Quelqu'un peut s'il vous plaît suggérer de meilleures références à lire pour le Client-Serveur NIO.

EDIT 2

Comme EJP mentionné dans son commentaire, le Carnet de commandes de la fenêtre de File d'attente était pleine.
J'ai modifié le code Client pour générer 100 threads et puis dormir pendant 5 secondes et de cette façon il n'y avait pas beaucoup de charge sur la File d'attente et plus de la connexion ont été couronnées de succès(mais toujours lors de la prise de 10 000 connexions certains ont toujours échoué).

êtes-vous à l'aide de windows ou linux?
Je suis avec windows

OriginalL'auteur cruxion effux | 2015-05-27

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *