Как использовать netty для передачи большого байтового потока (например, изображения) в сервисе сокетов
Мой сервер предоставляет сервис сокетов для клиента. Мой сервер DecoderHandler
простирается от FrameDecoder
, Когда мой клиент отправляет на сервер небольшие данные (байт меньше, чем 1024), сервер успешно их декодирует, но когда мой клиент пытается записать содержимое изображения на сервер, возникает исключение index-out-bound-exception,
Я предполагаю, что буфер, выбранный декодером, должен иметь ограничение по размеру. Поэтому я распечатал параметр - класс буфера.
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer buffer) throws Exception {
System.out.println(buffer.getClass());
return null;
}
Оказалось:
class org.jboss.netty.buffer.BigEndianHeapChannelBuffer
Я хотел бы спросить: могу ли я изменить тип буфера с BigEndianHeapChannelBuffer
в DynamicChannelBuffer
, так что я могу передать изображение через сокет. Или есть кто-нибудь, кто может предоставить другие действительные методы, которые помогут решить мою проблему "передачи больших данных через сокет с нетто".
Мне действительно нужно ваше мнение. Еще раз спасибо!
Трассировка стека с сервера:
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:
Трассировка стека от клиента:
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)
2 ответа
Из трассировки стека ясно, что это ошибка в вашем обработчике. Вы пытаетесь получить доступ к большему количеству байтов, чем есть в данный момент в com.netty.www.codec.MessageDecoder.receiveChatInfoBeanFromClient.
Вам нужно проверить, достаточно ли байтов доступно для чтения через "ChannelBuffer.readableBytes()", а если нет, вернуть null, чтобы он попытался снова вызвать ваш метод, если будет получено больше байтов. Проверьте apidocs для FrameDecoder для более подробной информации.
Пожалуйста, включите трассировку стека, поскольку IndexOutOfBoundsException звучит как ошибка для меня. Также включите версию netty и т. Д.