메시지로 NioDatagramChannel 및 protoBuf를 사용하여 netty를 사용하여 UDP 서버를 작성하려고합니다.Netty + NioDatagram (UDP) + ProtoBuf 문제 - 버려진 인바운드 메시지 DatagramPacket
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new UdpProtoBufServerChannelInitializer());
b.bind(port).sync().channel().closeFuture().await();
} finally {
group.shutdownGracefully();
}
UdpProtoBufServerChannelInitializer :
public class UdpProtoBufServerChannelInitializer extends ChannelInitializer<NioDatagramChannel> {
static final Logger logger = Logger.getLogger(UdpProtoBufServerChannelInitializer.class);
@Override
protected void initChannel(NioDatagramChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addFirst(new ProtobufVarint32FrameDecoder());
p.addFirst(new ProtobufDecoder(Message.getDefaultInstance()));
p.addFirst(new ProtobufVarint32LengthFieldPrepender());
p.addFirst(new ProtobufEncoder());
p.addFirst(new UdpProtoBufServerHandler());
}
}
는 그러나, 나는 UdpProtoBufServerChannelInitializer를 실행하기 전에 자바 클라이언트로부터 메시지를받은 후 다음과 같은 오류를보고하고 여기에 서버 구현입니다.
디버그 DefaultChannelPipeline : 76 - 폐기 DatagramPacket의 인바운드 메시지 (/127.0.0.1:60556 => 0.0.0.0/0.0.0.0:55559, PooledUnsafeHeapByteBuf (ridx 2048) 0 widx : 34 CAP)에 도달 파이프 라인의 꼬리. 파이프 라인 구성을 확인하십시오.
또한, 확실하지 않은 응용 프로그램을 실행하는 것은 관련이 예외 경우 : 파이프 라인이 더 소비자가 없습니다처럼2017-05-22 14:31:09 DEBUG PlatformDependent0:91 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
java.lang.ClassNotFoundException: jdk.internal.misc.Unsafe
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:288)
at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:895)
at io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:919)
at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:70)
at io.netty.util.ConstantPool.<init>(ConstantPool.java:32)
at io.netty.util.Signal$1.<init>(Signal.java:27)
at io.netty.util.Signal.<clinit>(Signal.java:27)
at io.netty.util.concurrent.DefaultPromise.<clinit>(DefaultPromise.java:43)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:36)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:52)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:87)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:82)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:63)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:51)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:43)
제안 해 주셔서 감사합니다. addLast로 변경 한 후에도 여전히 동일한 오류가 표시됩니다. 이것은 제 구현입니다 : 'ChannelPipeline p = ch.pipeline(); p.addLast (새 UdpProtoBufServerHandler()); p.addLast (new ProtobufVarint32FrameDecoder()); p.addLast (new ProtobufDecoder (Message.getDefaultInstance())); p.addLast (new ProtobufVarint32LengthFieldPrepender()); p.addLast (new ProtobufEncoder()); p.addLast (새 UdpProtoBufServerHandler());' – flashsnake