0

私のサーバーは、クライアントにソケット サービスを提供します。私のサーバーDecoderHandlerFrameDecoder. クライアントが小さなデータ (約 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

質問したいのですが、ソケットで画像を送信できるように、バッファのタイプを から に変更できますかBigEndianHeapChannelBufferDynamicChannelBufferまたは、「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:

クライアントからのスタックトレース:

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)
4

2 に答える 2

1

スタックトレースから、ハンドラーのバグであることは明らかです。その時点で com.netty.www.codec.MessageDecoder.receiveChatInfoBeanFromClient に存在するよりも多くのバイトにアクセスしようとしています

「ChannelBuffer.readableBytes()」を介して十分なバイトが読み取れるかどうかを確認し、そうでない場合はnullを返す必要があります。これにより、さらにバイトを受信した場合にメソッドを再度呼び出そうとします。詳細については、FrameDecoder の apidoc を確認してください。

于 2012-09-29T13:12:09.880 に答える
0

IndexOutOfBoundsException は私にはバグのように聞こえるので、スタックトレースを含めてください。また、netty バージョンなども含めてください。

于 2012-09-25T18:09:50.610 に答える