Netty の SnappyFrameEncoder/Decoder を使用する簡単なプログラムを作成しようとしています。サーバー/クライアントに LocalChannels を使用する小さな Java アプリケーションを作成しました。
クライアントは Snappy を使用して文字列をエンコードし、サーバーは文字列をデコードしてコンソールに書き込みます。
別のクライアント/サーバー プログラムに分割しても、StackOverFlow 例外が発生し続けます。
パイプラインから SnappyFramedDecoder と SnappyFramedEncoder をコメントアウトすると、エラーなしで実行され、テスト メッセージが出力されます。
非常に長いテスト メッセージを試しましたが、それでも StackOverFlow 例外が発生します。
誰か助けてくれませんか?私はNettyが初めてです。ありがとうございました!!
私はNetty 4.0.0.CR2を使用しています
これが私のコードです:
public class LocalNettyTest {
private static String LOCAL_ID = "localtest";
private static String TEST_STRING = "TEST";
public void run() throws Exception {
final LocalAddress addr = new LocalAddress(LOCAL_ID);
Bootstrap cb = new Bootstrap();
ServerBootstrap sb = new ServerBootstrap();
EventLoopGroup serverGroup = new LocalEventLoopGroup();
EventLoopGroup clientGroup = new LocalEventLoopGroup();
try {
sb.group(serverGroup)
.channel(LocalServerChannel.class)
.handler(new ChannelInitializer<LocalServerChannel>(){
@Override
public void initChannel(LocalServerChannel ch) throws Exception {
ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
}
})
.childHandler(new ChannelInitializer<LocalChannel>() {
@Override
public void initChannel(LocalChannel ch) throws Exception {
ch.pipeline().addLast(new SnappyFramedDecoder());
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new ChannelInboundMessageHandlerAdapter<String>() {
@Override
public void messageReceived(ChannelHandlerContext ctx,
String msg) throws Exception {
System.out.println ("RECEIVED: " + msg);
}
});
}
});
cb.group(clientGroup)
.channel(LocalChannel.class)
.handler(new ChannelInitializer<LocalChannel>() {
@Override
public void initChannel(LocalChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder ());
ch.pipeline().addLast(new SnappyFramedEncoder ());
}
});
// Start the server.
sb.bind(addr).sync();
// Start the client.
Channel ch = cb.connect(addr).sync().channel();
ChannelFuture lastWriteFuture = ch.write(TEST_STRING);
// Wait until all messages are flushed before closing the channel.
if (lastWriteFuture != null) {
System.out.println ("Waiting");
lastWriteFuture.awaitUninterruptibly();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
serverGroup.shutdownGracefully();
clientGroup.shutdownGracefully();
}
System.out.println ("Done");
}
public static void main(String[] args) throws Exception {
new LocalNettyTest().run();
}
}