Netty3.5.8を使用してゲームサーバーを作成しました。最初は、サーバーからクライアントへのデータ送信に問題はありません。しかし、サーバーがしばらく動作すると、多くの例外があります[Java.nio.channels.ClosedChannelException
]クライアントチャネルにデータを書き込むとき。
誰もが以前にこの例外を受け取ったことがある。これを修正するためのヒントはありますか?キャッシュバッファが原因だと思います。
このような私のコードサンプル:
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);
例外:Java.nio.channels.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)
ClosedChannelException
は、接続が閉じられたことを通知するだけなので、発行した書き込み要求を実行できませんでした。通常、次のいずれかを意味します。
(1)メッセージを書き込む前に、アプリケーションが別の場所で接続を閉じた、または
(2)メッセージを読む前に、ピアが接続を閉じました。
(1)と(2)を修正すると、ClosedChannelException
は表示されなくなります。
ClosedChannelExceptionは、yoチャネルを閉じて、引き続き使用していることを意味します。それはあなたの側のプログラミングエラーです。