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...
où 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?
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
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