Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets 如何使用netty在套接字服务中传输大字节流(如图像)_Sockets_Netty_Indexoutofboundsexception_Decoder_Socketchannel - Fatal编程技术网

Sockets 如何使用netty在套接字服务中传输大字节流(如图像)

Sockets 如何使用netty在套接字服务中传输大字节流(如图像),sockets,netty,indexoutofboundsexception,decoder,socketchannel,Sockets,Netty,Indexoutofboundsexception,Decoder,Socketchannel,我的服务器为客户端提供套接字服务。我的服务器的DecoderHandler扩展自FrameDecoder。当我的客户机向服务器发送小数据(小于1024字节)时,服务器会成功解码,但当我的客户机尝试将图像内容写入服务器时,会出现索引外边界异常 我猜解码器选择的缓冲区一定有大小限制。所以我打印出了参数——buffer的类 @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, Chan

我的服务器为客户端提供套接字服务。我的服务器的
DecoderHandler
扩展自
FrameDecoder
。当我的客户机向服务器发送小数据(小于1024字节)时,服务器会成功解码,但当我的客户机尝试将图像内容写入服务器时,会出现索引外边界异常

我猜解码器选择的缓冲区一定有大小限制。所以我打印出了参数——buffer的类

@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
        ChannelBuffer buffer) throws Exception {
    System.out.println(buffer.getClass());
    return null;
}
结果是:

class org.jboss.netty.buffer.bigendianhapchannelbuffer

我想问:我可以把缓冲区的类型从
bigendianhapchannelbuffer
改为
DynamicChannelBuffer
,这样我就可以通过套接字传输图像了。或者有没有人可以提供其他有效的方法来帮助解决我的“通过套接字与netty传输大数据”问题

我真的需要你的意见。再次感谢


来自服务器的堆栈跟踪:

java.lang.IndexOutOfBoundsException
at org.jboss.netty.buffer.AbstractChannelBuffer.checkReadableBytes(AbstractChannelBuffer.java:657)
at org.jboss.netty.buffer.AbstractChannelBuffer.readBytes(AbstractChannelBuffer.java:337)
at org.jboss.netty.buffer.AbstractChannelBuffer.readBytes(AbstractChannelBuffer.java:343)
at com.netty.www.codec.MessageDecoder.receiveChatInfoBeanFromClient(MessageDecoder.java:422)
at com.netty.www.codec.MessageDecoder.decode(MessageDecoder.java:70)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:282)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:216)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:349)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:280)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:200)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
12/09/26 09:12:09 INFO server.MessageServerHandler: The user's channel is closed:
来自客户端的stacktrace:

java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.write(Unknown Source)
at neusoft.socket.TCPClient.writeBytes(TCPClient.java:217)
at neusoft.socket.TestChatNew.sendChartMedia(TestChatNew.java:185)
at neusoft.socket.TestChatNew.main(TestChatNew.java:36)

请将stacktrace作为IndexOutOfBoundsException包含在内,我觉得这似乎是一个bug。。还包括netty版本等。

从stacktrace中可以清楚地看出,这是处理程序中的一个错误。您尝试访问更多的字节,然后在com.netty.www.codec.MessageDecoder.receiveChatInfoBeanFromClient中出现


您需要通过“ChannelBuffer.readableBytes()”检查是否有足够的字节是可读的,如果没有,则返回null,以便在收到更多字节时,它将再次尝试调用您的方法。查看apidocs for FrameDecoder以了解更多详细信息。

:仅供参考。我已将堆栈跟踪添加到原始帖子中。我的netty版本是3.5.7Final。我在这里问了一个非常简单的问题吗?:)事实证明,这正是你所说的:在调用channelbuffer.readbytes()之前,我没有使用channelbuffer.readblebytes()检查可读字节。这个问题很久以前就解决了,但是,我想对你的帮助表示感谢,并关闭这篇文章!