Exception java.nio.les canaux.ClosedChannelException lors de l'écriture de client canal
J'ai créé un serveur de jeu à l'aide de netty 3.5.8.
Au premier abord, il n'y a aucun problème avec l'envoi de données depuis le serveur vers le client.
Mais lorsque le serveur fonctionne pendant un certain temps, il y a de nombreuses exceptions [java.nio.channels.ClosedChannelException
] quand j'écris des données au client de canal.
Quelqu'un a eu cette exception avant. Est-il une astuce pour résoudre ce problème?
Je pense que sur la mémoire cache la cause de cela.
Mon exemple de code comme ceci:
ChannelBuffer bff = ChannelBuffers.buffer(18);
bff.writeByte(Events.S_SERVER_PUSH);
bff.writeByte((byte)0);
bff.writeInt(idRoom);
bff.writeInt(playerCnt);
bff.writeInt(gameCnt);
bff.writeInt(freePlayer);
channel.write(bff);
Exception: java.nio.les canaux.ClosedChannelException
java.nio.channels.ClosedChannelException
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:784)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:507)
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:129)
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:66)
at org.jboss.netty.channel.Channels.write(Channels.java:733)
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:71)
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:60)
at org.jboss.netty.channel.Channels.write(Channels.java:712)
at org.jboss.netty.channel.Channels.write(Channels.java:679)
at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:248)
at myclass.SendPushData(GameRoom.java:231)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:458)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:439)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:84)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:471)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:332)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
L'exception soulève de plus en plus fréquemment quand j'écris pour envoyer des données multi-clients dans la boucle for
Merci De Tube. Ce type de Code (PlayerInfo p:this.players.values()){ ChannelBuffer bff = ChannelBuffers.de la mémoire tampon(18); bff.writeByte(Événements.S_SERVER_PUSH); bff.writeByte(typePush);bff.writeInt(idRoom); bff.writeInt(idGame); bff.writeInt(gameCnt*2); bff.writeInt(freePlayer); p.getChannel().écrire(bff); Thread.sleep(100); } }
Question connexe - stackoverflow.com/questions/24975455/...
Merci De Tube. Ce type de Code (PlayerInfo p:this.players.values()){ ChannelBuffer bff = ChannelBuffers.de la mémoire tampon(18); bff.writeByte(Événements.S_SERVER_PUSH); bff.writeByte(typePush);bff.writeInt(idRoom); bff.writeInt(idGame); bff.writeInt(gameCnt*2); bff.writeInt(freePlayer); p.getChannel().écrire(bff); Thread.sleep(100); } }
Question connexe - stackoverflow.com/questions/24975455/...
OriginalL'auteur Tuan Huy | 2012-12-25
Vous devez vous connecter pour publier un commentaire.
ClosedChannelException
simplement vous indique que la connexion a été fermée, de sorte que la demande d'écriture vous émises ne pouvait pas être fait. Cela signifie généralement que:(1) votre demande de fermeture de la connexion par ailleurs avant d'écrire le message ou
(2) vos pairs fermeture de la connexion avant de lire votre message.
Si vous fixe (1) et (2), vous ne devriez pas voir le
ClosedChannelException
plus.Pas de. Vous pouvez vérifier le code de netty. canal.write() ou ctx.write() va appeler AbstractUnsafe de la méthode write (), qui peut fixer ClosedChannelException de la promesse, si la sortie de la mémoire tampon est null. Et la mémoire tampon peut être effacé si le pair a fermé la connexion.
Puis Netty a abusé de l'exception. Sa Javadoc est parfaitement clair.
OriginalL'auteur trustin
ClosedChannelException signifie vous ont fermé le canal et a continué à l'utiliser. C'est une erreur de programmation de votre part.
Assez difficile comme vous l'avez supprimé, mais il y avait au moins deux erreurs. ClosedChannelException et AsynchronousCloseException n'ont rien à voir avec les pairs.
OriginalL'auteur user207421