Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常java.nio.channels.ClosedChannel写入客户端通道时异常_Java_Exception_Netty - Fatal编程技术网

异常java.nio.channels.ClosedChannel写入客户端通道时异常

异常java.nio.channels.ClosedChannel写入客户端通道时异常,java,exception,netty,Java,Exception,Netty,我已经使用netty 3.5.8创建了一个游戏服务器。 首先,从服务器向客户机发送数据没有任何问题。 但当服务器运行一段时间后,当我将数据写入客户机通道时,会出现许多异常[java.nio.channels.ClosedChannelException] 以前有人遇到过这种异常。有什么建议可以解决这个问题吗? 我认为这是缓存缓冲区造成的 我的代码示例如下: ChannelBuffer bff = ChannelBuffers.buffer(18); bff.writeByte(Events.S_

我已经使用netty 3.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),则不应再看到
ClosedChannel异常

ClosedChannel异常表示您已关闭频道并继续使用它。这是您的一个编程错误。

当我编写将数据发送到中的多客户端以进行循环时,异常会更频繁地出现。类似这样的代码用于(PlayerInfo p:this.players.values()){ChannelBuffer bff=ChannelBuffers.buffer(18);bff.writeByte(Events.S_SERVER_PUSH);bff.writeByte(typePush);bff.writeInt(idRoom);bff.writeInt(idGame);bff.writeInt(gameCnt*2);bff.writeInt(freePlayer);p.getChannel().write(bff);Thread.sleep(100);}}相关问题-仅表示(1)。对等关闭会导致IOException:“连接重置”。否。你可以查一下内蒂的密码。channel.write()或ctx.write()将调用AbstractSafe的write()方法,如果出站缓冲区为空,该方法可能会将ClosedChannelException设置为promise。如果对等方关闭了连接,缓冲区可能会被清除。@AdrianLiu然后Netty误用了异常。它的Javadoc非常清晰。EJP-如何确定连接中断时引发了哪个异常。我试图在这里回答这个问题-如果你能回答这个问题并就我的答案给我一些反馈,我将不胜感激。谢谢你。@james很难,因为你已经删除了它,但至少有两个错误。ClosedChannelException和AsynchronousCloseException与对等方无关。