1

Je suis assez nouveau dans Java et j'essaie de coder une configuration expéditeur-canal-récepteur, où le canal représente un support de transmission et introduit des erreurs dans les paquets. Ainsi, le canal est connecté à l'expéditeur et le récepteur à l'aide de canaux de socket serveur. La plupart de c'est bien, mais quand j'essaie de lire l'objet Packet dans le canal, il jette IllegalBlockingModeException. L'expéditeur lance ce qui semble être une exception d'E/S correspondante, "Une connexion existante a été fermée de force par l'hôte distant". Le code du programme Channel est la suivante (certaines parties exclues pour simplifier):Exception de mode de blocage non autorisé lors d'une tentative de lecture à partir du socket

Set<SelectionKey> selectedKeys = selector.selectedKeys(); 
Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); 
while (keyIterator.hasNext()) { 
    SelectionKey key = keyIterator.next(); 
    keyIterator.remove(); 
    if (key.isAcceptable()) { 
     SocketChannel sc = ((ServerSocketChannel) key.channel()).accept(); 
     sc.configureBlocking(false); 
     sc.register(selector, SelectionKey.OP_READ); 
    } 
    if (key.isReadable()) { 
     SocketChannel sc = (SocketChannel) key.channel(); 
     sc.configureBlocking(false); 
     Packet packet = readPacket(sc); 
     sc.close(); 
     // do things with the packet... 

readPacket est défini comme suit:

private static Packet readPacket(SocketChannel sc) throws IOException, 
ClassNotFoundException { 
    ObjectInputStream in = new 
    ObjectInputStream(sc.socket().getInputStream()); 
    Packet packet = (Packet) in.readObject(); 
    return packet; 
} 

est une personne capable de bien vouloir expliquer ce qui jette l'exception et comment le rectifier?

Répondre

0

Les flux bloquent. Vous ne pouvez pas les utiliser en mode non bloquant. Voir le Javadoc.

+0

En effet, j'ai vu cela dans le Javadoc. Donc, ce que je demande, c'est comment rectifier cela? Comment puis-je lire la socket si ce n'est avec des flux? – eles

+0

Vous pouvez * le lire * avec des flux, mais pas en mode non bloquant. La sérialisation et NIO sont un très mauvais ajustement. Décider. Un ou l'autre. – EJP