Question

Au lieu d'utiliser un sélecteur de la manière habituelle, où pour chaque canal prêt un message peut être déterminé et envoyé, je voudrais choisir selon la connexion est actuellement prêt et envoyer un message là-bas.

On peut supposer que cela peut être fait en jetant tous les canaux dans un sélecteur pour la lecture et les marquer prêts pour la lecture si elles sortent, puis en faisant la même chose pour l'écriture, puis en choisissant parmi ceux que j'ai marqué prêt.

Est-ce une bonne idée, est-il une meilleure façon de le faire, et que dois-je faire attention? Par exemple, le Rox Tutoriel des états de "Si vous essayez de mélanger OP LIRE et OP ECRIRE vous allez vite vous des ennuis. La mise en œuvre Sun Windows a été vu à une impasse si vous faites cela. " y at-il gotchas similaires ici? Quelle est la meilleure façon de mettre en œuvre:

boolean isReadyForRead(SocketChannel c);
boolean isReadyForWrite(SocketChannel c);
Était-ce utile?

La solution

Que diriez-vous quelque chose comme ça?

public static boolean isReadyForRead(SocketChannel socket) throws IOException {
    return isReady(socket, SelectionKey.OP_READ);
}

public static boolean isReadyForWrite(SocketChannel socket) throws IOException {
    return isReady(socket, SelectionKey.OP_WRITE);
}

public static boolean isReady(SocketChannel socket, int op) throws IOException {
    // Setup
    if (socket.isBlocking()) 
        throw new IllegalArgumentException("Socket must be in non-blocking mode");

    Selector selector = SelectorProvider.provider().openSelector();
    socket.register(selector, op);

    // Real work
    if (selector.selectNow() == 0)
        return false;
    // Just in case selector has other keys
    return selector.selectedKeys().contains(socket.keyFor(selector));
}

Cet appel est terriblement inefficace, car il fait la configuration à chaque fois. Si vous avez une classe englobante, cela devrait être déplacé. Si vous connaissez sélecteur ne contient une clé, la dernière ligne peut être changée en « return true; ».

Je suis en train de faire tout cela pour le plaisir. Je ne peux pas penser à un scénario que ce sera utile. Sélectionnez () est conçu pour vous dire l'état des prises efficacement et tout le monde devrait l'utiliser directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top