1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/**
* Fonction principale du thread.
*
* <p>Boucle sans fin qui reçoit les évènements du selectorThread</p>
*/
public void run() {
while (!closeRequested) {
//Exécution des taches
doInvocations();
//Requête de fermeture du thread
if (!closeRequested) {
int selectedKeys;
try {
selectedKeys = selector.select();
} catch (IOException ioe) {
listenerError.eventError(ioe);
continue;
}
if (selectedKeys == 0) {
/*si réveillé par 'selector.wakeup()'
et pas d'évènement à traiter*/
continue;
}
// Récupère la liste des events
final Iterator < SelectionKey > itSKey = selector.selectedKeys()
.iterator();
while (itSKey.hasNext()) {
final SelectionKey sKey = (SelectionKey) itSKey.next();
itSKey.remove();
eventDistribution(sKey);
}
}
}
if (closeRequested) {
//fermeture
try {
closeSelectorAndChannels();
} catch (IOException ex) {
listenerError.eventError(ex);
}
}
}
/**
* Fonction permettant de répartir les évènements vers les interfaces.
*
* @param sKey Descripteur de l'evènement
*/
private void eventDistribution(final SelectionKey sKey) {
try {
final int readyOps = sKey.readyOps();
//disable l'évènement
sKey.interestOps(sKey.interestOps() & ~readyOps);
if (sKey.isAcceptable()) {
//Évènement ACCEPT
if (currentAccept >= MAX_ACCEPT) {
//!!!! signale juste le refus mais ne fais rien
((ISelectorListenerAccept) sKey.attachment()).eventRefused();
} else {
//!!!!! accept la connexion par .accept()
((ISelectorListenerAccept) sKey.attachment()).eventAccept();
}
} else if (sKey.isConnectable()) {
//Évènement CONNECT
((ISelectorListenerConnect) sKey.attachment())
.eventConnect();
} else {
if (sKey.isReadable()) {
//Évènement READ
((ISelectorListenerReadWrite) sKey.attachment())
.eventRead();
}
if (sKey.isValid() && sKey.isWritable()) {
//Évènement WRITE
((ISelectorListenerReadWrite) sKey.attachment())
.eventWrite();
}
}
} catch (CancelledKeyException ex) {
//Fermeture des connexions
try {
closeSelectorAndChannels();
listenerError.eventError(ex);
} catch (IOException exClose) {
//+ Erreur à la fermeture
exClose.initCause(ex);
listenerError.eventError(exClose);
}
}catch (NullPointerException ex) {
//Fermeture des connexions
try {
closeSelectorAndChannels();
listenerError.eventError(ex);
} catch (IOException exClose) {
//+ Erreur à la fermeture
exClose.initCause(ex);
listenerError.eventError(exClose);
}
}
} |
Partager