我有以下绑定来处理udp数据包
private void doStartServer() {
final UDPPacketHandler udpPacketHandler = new UDPPacketHandler(messageDecodeHandler);
workerGroup = new NioEventLoopGroup(threadPoolSize);
try {
final Bootstrap bootstrap = new Bootstrap();
bootstrap
.group(workerGroup)
.handler(new LoggingHandler(nettyLevel))
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(udpPacketHandler);
bootstrap
.bind(serverIp, serverPort)
.sync()
.channel()
.closeFuture()
.await();
} finally {
stop();
}
}
和处理程序
@ChannelHandler.Sharable << note this
@Slf4j
@AllArgsConstructor
public class UDPPacketHandler extends SimpleChannelInboundHandler<DatagramPacket> {
private final MessageP54Handler messageP54Handler;
@Override
public void channelReadComplete(final ChannelHandlerContext ctx) {
ctx.flush();
}
@Override
public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) {
log.error("Exception in UDP handler", cause);
ctx.close();
}
}
在某个时刻我得到了这个例外 java.net.SocketException: Network dropped connection on reset: no further information
这是在 exceptionCaught
. 这会触发 ChannelHandlerContext
关闭。在这一点上,我的整个服务器停止(在 finnaly
(第一个代码段中的块)
如何正确地处理异常,以便我可以处理新的连接,即使在这种异常发生后?
1条答案
按热度按时间wnavrhmk1#
你不应该关门
ChannelHandlerContext
在IOException
当使用DatagramChannel
. 作为DatagramChannel
是“无连接”异常是特定于一个“接收”或一个“发送”操作的。所以只要记录它(或者你想做的任何事情)然后继续。