From 98469906047a569cad8d6f0f719bf7d59ab3e3b3 Mon Sep 17 00:00:00 2001 From: limqhz <540344226@qq.com> Date: Wed, 8 Apr 2026 16:35:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=AD=E9=93=BE=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B0=86=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=AF=AF=E6=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sv/netty/netty/ServerHandler.java | 37 +++++++++++++------ .../impl/ServerMessageHandlerAdapter.java | 2 +- .../sv/intergration/impl/OldDoorService.java | 2 +- .../main/java/com/sv/netty/ClientHandler.java | 22 ++++++----- 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/api/src/main/java/com/sv/netty/netty/ServerHandler.java b/api/src/main/java/com/sv/netty/netty/ServerHandler.java index 29a88f9..9d189f8 100644 --- a/api/src/main/java/com/sv/netty/netty/ServerHandler.java +++ b/api/src/main/java/com/sv/netty/netty/ServerHandler.java @@ -49,10 +49,15 @@ public class ServerHandler extends SimpleChannelInboundHandler { */ @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { - String clientIp = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getClientIp(); - logger.info("接收服务器响应msg:[" + msg + "]"); + String clientIp = "no-ip"; try { + clientIp = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getClientIp(); + logger.info("接收服务器响应msg:[" + msg + "]"); VenueMessage message = JsonUtils.decode(msg, VenueMessage.class); + if (message == null || message.getMessageType() == null) { + logger.warn("收到无法解析的消息,忽略。来源IP:[" + clientIp + "], 内容:[" + msg + "]"); + return; + } switch (message.getMessageType()) { case HB: HeartBeat hb = JsonUtils.decode(message.getMessage(),HeartBeat.class); @@ -104,11 +109,14 @@ public class ServerHandler extends SimpleChannelInboundHandler { */ @Override public void channelInactive(ChannelHandlerContext ctx) { - String clientIP = ((InetSocketAddress) ctx.channel().remoteAddress()).getAddress().getHostAddress(); - logger.error("Client ip [" + clientIP + "] has inactive"); - Integer venueId = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getVenueId(); - String deviceName = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceName(); - messageService.Offline(deviceName,venueId); + ChannelParam param = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get(); + if (param != null && param.getVenueId() != null) { + String clientIP = ((InetSocketAddress) ctx.channel().remoteAddress()).getAddress().getHostAddress(); + logger.error("Client ip [" + clientIP + "] has inactive"); + Integer venueId = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getVenueId(); + String deviceName = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceName(); + messageService.Offline(deviceName,venueId); + } } /** @@ -121,11 +129,12 @@ public class ServerHandler extends SimpleChannelInboundHandler { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { logger.error("ServerHandler exceptionCaught",cause); Channel channel = ctx.channel(); + ChannelParam param = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get(); // Integer venueId = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getVenueId(); // String deviceName = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceName(); // DeviceType deviceType = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceType(); // messageService.Offline(deviceName,venueId,deviceType); - if(channel.isActive()) { + if(channel.isActive() && param != null && param.getVenueId() != null) { // 错误产生,关闭连接 ctx.close(); } @@ -141,10 +150,14 @@ public class ServerHandler extends SimpleChannelInboundHandler { IdleState state = ((IdleStateEvent) evt).state(); if (state == IdleState.READER_IDLE){ logger.info("IdleStateEvent READER_IDLE 超时"); - Integer venueId = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getVenueId(); - String deviceName = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceName(); - messageService.Offline(deviceName,venueId); - ctx.channel().close(); + ChannelParam param = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get(); + if (param != null && param.getVenueId() != null) { + // 原有逻辑 + Integer venueId = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getVenueId(); + String deviceName = ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().getDeviceName(); + messageService.Offline(deviceName,venueId); + ctx.channel().close(); + } } } Set connections = messageService.countConnection(); diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java index d82b827..be4d338 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java @@ -416,7 +416,7 @@ public class ServerMessageHandlerAdapter implements MessageService { * 判断是否有该通道 */ public boolean contains(String deviceName, Integer venueId) { - String clientId = deviceName + NettyConstant.SPIT_WORD + venueId + NettyConstant.SPIT_WORD; + String clientId = deviceName + NettyConstant.SPIT_WORD + venueId; return links.containsKey(clientId); } diff --git a/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java b/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java index 97ec131..7e6eed6 100644 --- a/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java +++ b/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java @@ -59,7 +59,7 @@ public class OldDoorService implements DoorService { @Override public void WatchEvent(ConnectorDetial connectorDetial, INData inData) { - logger.error("WatchEvent open door ..."); + logger.info("WatchEvent open door ..."); } }; } diff --git a/netty-client/src/main/java/com/sv/netty/ClientHandler.java b/netty-client/src/main/java/com/sv/netty/ClientHandler.java index 178d1d3..58a1411 100644 --- a/netty-client/src/main/java/com/sv/netty/ClientHandler.java +++ b/netty-client/src/main/java/com/sv/netty/ClientHandler.java @@ -3,7 +3,6 @@ package com.sv.netty; import com.sv.intergration.MessageService; import com.sv.netty.config.VenueMessage; import com.sv.netty.utils.JsonUtils; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -53,8 +52,16 @@ public class ClientHandler extends SimpleChannelInboundHandler { @Override public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { logger.info("get server msg:[" + msg + "]"); - VenueMessage message = JsonUtils.decode(msg, VenueMessage.class); - MessageService.getInstance().execute(message); + try { + VenueMessage message = JsonUtils.decode(msg, VenueMessage.class); + if (message == null || message.getMessageType() == null) { + logger.error("收到无法解析的消息,忽略: " + msg); + return; + } + MessageService.getInstance().execute(message); + } catch (Exception e) { + logger.error("处理服务器消息异常,不影响连接: " + msg, e); + } } /** @@ -66,7 +73,7 @@ public class ClientHandler extends SimpleChannelInboundHandler { public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws UnknownHostException { if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.ALL_IDLE) { + if (event.state() == IdleState.WRITER_IDLE) { ctx.write(MessageHandler.sendHeartBeat()); ctx.flush(); } @@ -81,12 +88,7 @@ public class ClientHandler extends SimpleChannelInboundHandler { */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - logger.info("ClientHandler exceptionCaught"); - cause.printStackTrace(); - Channel channel = ctx.channel(); - if(channel.isActive()) { - ctx.close(); - } + logger.error("ClientHandler exceptionCaught, 保持连接不关闭", cause); } }