web-dev-qa-db-ja.com

クライアントチャネルへの書き込み時の例外Java.nio.channels.ClosedChannelException

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)
6
Tuan Huy

ClosedChannelExceptionは、接続が閉じられたことを通知するだけなので、発行した書き込み要求を実行できませんでした。通常、次のいずれかを意味します。

(1)メッセージを書き込む前に、アプリケーションが別の場所で接続を閉じた、または
(2)メッセージを読む前に、ピアが接続を閉じました。

(1)と(2)を修正すると、ClosedChannelExceptionは表示されなくなります。

7
trustin

ClosedChannelExceptionは、yoチャネルを閉じて、引き続き使用していることを意味します。それはあなたの側のプログラミングエラーです。

3
user207421