diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/advanced/ClientDistributeSingleClientMessageTypeAdvanced.java b/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/advanced/ClientDistributeSingleClientMessageTypeAdvanced.java new file mode 100644 index 0000000..088ad0b --- /dev/null +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/advanced/ClientDistributeSingleClientMessageTypeAdvanced.java @@ -0,0 +1,28 @@ +package wu.framework.lazy.cloud.heartbeat.client.netty.advanced; + +import io.netty.channel.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import wu.framework.lazy.cloud.heartbeat.common.NettyProxyMsg; +import wu.framework.lazy.cloud.heartbeat.common.advanced.client.AbstractDistributeSingleClientMessageTypeAdvanced; + +/** + * 接收服务端发送过来的聊天信息 + */ +@Slf4j +@Component +public class ClientDistributeSingleClientMessageTypeAdvanced extends AbstractDistributeSingleClientMessageTypeAdvanced { + /** + * 处理当前数据 + * + * @param channel 当前通道 + * @param nettyProxyMsg 通道数据 + */ + @Override + protected void doHandler(Channel channel, NettyProxyMsg nettyProxyMsg) { + byte[] clientId = nettyProxyMsg.getClientId(); + byte[] data = nettyProxyMsg.getData(); + log.info("接收客户端:{},发送过来的聊天信息:{}",new String( clientId),new String( data )); + + } +} diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/config/HeartbeatClientConfiguration.java b/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/config/HeartbeatClientConfiguration.java index 51ad902..3dd6b18 100644 --- a/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/config/HeartbeatClientConfiguration.java +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/wu/framework/lazy/cloud/heartbeat/client/netty/config/HeartbeatClientConfiguration.java @@ -31,6 +31,14 @@ public class HeartbeatClientConfiguration { public ClientDistributeSingleClientRealAutoReadConnectTypeAdvanced clientDistributeSingleClientRealAutoReadConnectTypeAdvanced(){ return new ClientDistributeSingleClientRealAutoReadConnectTypeAdvanced(); } + /** + * 处理 接收服务端发送过来的聊天信息 + * @return ClientDistributeSingleClientMessageTypeAdvanced + */ + @Bean + public ClientDistributeSingleClientMessageTypeAdvanced clientDistributeSingleClientMessageTypeAdvanced(){ + return new ClientDistributeSingleClientMessageTypeAdvanced(); + } @Bean public ClientDistributeSingleClientRealCloseVisitorTypeAdvanced clientDistributeSingleClientRealCloseVisitorTypeAdvanced(){ return new ClientDistributeSingleClientRealCloseVisitorTypeAdvanced(); diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/MessageType.java b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/MessageType.java index 357d1f5..aad12db 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/MessageType.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/MessageType.java @@ -73,6 +73,13 @@ public class MessageType { */ public static final byte REPORT_SINGLE_CLIENT_CLOSE_VISITOR = 0X08; + /** + * 上报 客户端消息到另一个客户端 + * + * @see MessageTypeEnums#REPORT_SINGLE_CLIENT_MESSAGE + * @see AbstractReportSingleClientMessage2OtherClientTypeAdvanced + */ + public static final byte REPORT_SINGLE_CLIENT_MESSAGE = 0X09; /** * 下发 客户端接收连接成功通知 @@ -134,5 +141,11 @@ public class MessageType { */ public static final byte DISTRIBUTE_SINGLE_CLIENT_REAL_CLOSE_VISITOR = -0X08; - + /** + * 下发 客户端消息 + * + * @see MessageTypeEnums#DISTRIBUTE_SINGLE_CLIENT_MESSAGE + * @see AbstractDistributeSingleClientMessageTypeAdvanced + */ + public static final byte DISTRIBUTE_SINGLE_CLIENT_MESSAGE = -0X09; } diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/client/AbstractDistributeSingleClientMessageTypeAdvanced.java b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/client/AbstractDistributeSingleClientMessageTypeAdvanced.java new file mode 100644 index 0000000..6374674 --- /dev/null +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/client/AbstractDistributeSingleClientMessageTypeAdvanced.java @@ -0,0 +1,25 @@ +package wu.framework.lazy.cloud.heartbeat.common.advanced.client; + + +import wu.framework.lazy.cloud.heartbeat.common.NettyProxyMsg; +import wu.framework.lazy.cloud.heartbeat.common.advanced.AbstractChannelTypeAdvanced; +import wu.framework.lazy.cloud.heartbeat.common.advanced.ChannelTypeAdvanced; +import wu.framework.lazy.cloud.heartbeat.common.enums.MessageTypeEnums; + +/** + * 下发 客户端关闭代理服务通道 + */ + +public abstract class AbstractDistributeSingleClientMessageTypeAdvanced extends AbstractChannelTypeAdvanced implements ChannelTypeAdvanced { + + /** + * 是否支持当前类型 + * + * @param msg 通道数据 + * @return 布尔类型 是、否 + */ + @Override + public boolean doSupport(NettyProxyMsg msg) { + return MessageTypeEnums.DISTRIBUTE_SINGLE_CLIENT_MESSAGE.getTypeByte() == msg.getType(); + } +} diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/server/AbstractReportSingleClientMessage2OtherClientTypeAdvanced.java b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/server/AbstractReportSingleClientMessage2OtherClientTypeAdvanced.java new file mode 100644 index 0000000..87dfdbb --- /dev/null +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/advanced/server/AbstractReportSingleClientMessage2OtherClientTypeAdvanced.java @@ -0,0 +1,27 @@ +package wu.framework.lazy.cloud.heartbeat.common.advanced.server; + + +import wu.framework.lazy.cloud.heartbeat.common.NettyProxyMsg; +import wu.framework.lazy.cloud.heartbeat.common.advanced.AbstractChannelTypeAdvanced; +import wu.framework.lazy.cloud.heartbeat.common.advanced.ChannelTypeAdvanced; +import wu.framework.lazy.cloud.heartbeat.common.enums.MessageTypeEnums; + + +/** + * 服务端处理客户端 关闭一个访客 + * REPORT_SINGLE_CLIENT_CLOSE_VISITOR + */ +public abstract class AbstractReportSingleClientMessage2OtherClientTypeAdvanced extends AbstractChannelTypeAdvanced implements ChannelTypeAdvanced { + + + /** + * 是否支持当前类型 + * + * @param msg 通道数据 + * @return 布尔类型 是、否 + */ + @Override + public boolean doSupport(NettyProxyMsg msg) { + return MessageTypeEnums.REPORT_SINGLE_CLIENT_MESSAGE.getTypeByte() == msg.getType(); + } +} diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/enums/MessageTypeEnums.java b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/enums/MessageTypeEnums.java index 00d7b54..0c35f8d 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/enums/MessageTypeEnums.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/wu/framework/lazy/cloud/heartbeat/common/enums/MessageTypeEnums.java @@ -46,6 +46,10 @@ public enum MessageTypeEnums { * @see AbstractReportSingleClientCloseVisitorTypeAdvanced */ REPORT_SINGLE_CLIENT_CLOSE_VISITOR(MessageType.REPORT_SINGLE_CLIENT_CLOSE_VISITOR, "上报 客户端关闭一个访客通道"), + /** + * @see AbstractReportSingleClientMessage2OtherClientTypeAdvanced + */ + REPORT_SINGLE_CLIENT_MESSAGE(MessageType.REPORT_SINGLE_CLIENT_MESSAGE, "上报 客户端消息到另一个客户端"), /** * @see AbstractDistributeConnectSuccessNotificationTypeAdvanced */ @@ -83,6 +87,10 @@ public enum MessageTypeEnums { * @see AbstractDistributeSingleClientRealCloseVisitorTypeAdvanced */ DISTRIBUTE_SINGLE_CLIENT_REAL_CLOSE_VISITOR(MessageType.DISTRIBUTE_SINGLE_CLIENT_REAL_CLOSE_VISITOR, "下发 客户端关闭代理服务通道"), + /** + * @see AbstractDistributeSingleClientMessageTypeAdvanced + */ + DISTRIBUTE_SINGLE_CLIENT_MESSAGE(MessageType.DISTRIBUTE_SINGLE_CLIENT_MESSAGE, "下发 客户端消息"), ; diff --git a/wu-lazy-cloud-heartbeat-sample/wu-lazy-cloud-heartbeat-client-sample/src/main/resources/application-dev.yml b/wu-lazy-cloud-heartbeat-sample/wu-lazy-cloud-heartbeat-client-sample/src/main/resources/application-dev.yml index 696d6f4..fba541b 100644 --- a/wu-lazy-cloud-heartbeat-sample/wu-lazy-cloud-heartbeat-client-sample/src/main/resources/application-dev.yml +++ b/wu-lazy-cloud-heartbeat-sample/wu-lazy-cloud-heartbeat-client-sample/src/main/resources/application-dev.yml @@ -1,12 +1,12 @@ spring: lazy: netty: -# inet-host: 127.0.0.1 -# inet-port: 7001 -# inet-path: middleground-on-cloud-heartbeat-server - inet-host: 124.222.48.62 # 服务端地址 - inet-port: 30676 #服务端端口 + inet-host: 127.0.0.1 + inet-port: 7001 inet-path: middleground-on-cloud-heartbeat-server +# inet-host: 124.222.48.62 # 服务端地址 +# inet-port: 30676 #服务端端口 +# inet-path: middleground-on-cloud-heartbeat-server client-id: local # 客户端ID data: redis: diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/NettyClientStateApplication.java b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/NettyClientStateApplication.java index d30f26a..cab2c04 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/NettyClientStateApplication.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/NettyClientStateApplication.java @@ -104,4 +104,10 @@ public interface NettyClientStateApplication { Result remove(NettyClientStateRemoveCommand nettyClientStateRemoveCommand); + /** + * 通过客户端心跳通道发送客户端请求 + * @param nettyClientMessageCommand 发送请求到客户端 + * @return {@link Result} + */ + Result sendMessage2HeartbeatClient(NettyClientMessageCommand nettyClientMessageCommand); } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/command/netty/client/state/NettyClientMessageCommand.java b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/command/netty/client/state/NettyClientMessageCommand.java new file mode 100644 index 0000000..f54d88b --- /dev/null +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/command/netty/client/state/NettyClientMessageCommand.java @@ -0,0 +1,36 @@ +package wu.framework.lazy.cloud.heartbeat.server.application.command.netty.client.state; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; +import wu.framework.lazy.cloud.heartbeat.common.enums.NettyClientStatus; + +import java.time.LocalDateTime; + +/** + * describe 发送请求到客户端 + * + * @author Jia wei Wu + * @date 2023/12/27 03:46 下午 + * @see com.wu.framework.inner.lazy.persistence.reverse.lazy.ddd.DefaultDDDLazyRemoveCommand + **/ +@Data +@Accessors(chain = true) +@Schema(title = "netty_client_message_command", description = "客户端状态") +public class NettyClientMessageCommand { + + + /** + * 客户端ID + */ + @Schema(description = "客户端ID", name = "clientId", example = "") + private String clientId; + + + /** + * 发送的消息 + */ + @Schema(description = "发送的消息", name = "message", example = "") + private String message; + +} \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/impl/NettyClientStateApplicationImpl.java b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/impl/NettyClientStateApplicationImpl.java index 6187102..121f4c3 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/impl/NettyClientStateApplicationImpl.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/application/impl/NettyClientStateApplicationImpl.java @@ -2,7 +2,11 @@ package wu.framework.lazy.cloud.heartbeat.server.application.impl; +import com.wu.framework.response.ResultFactory; +import io.netty.channel.Channel; import wu.framework.lazy.cloud.heartbeat.common.ChannelContext; +import wu.framework.lazy.cloud.heartbeat.common.MessageType; +import wu.framework.lazy.cloud.heartbeat.common.NettyProxyMsg; import wu.framework.lazy.cloud.heartbeat.server.application.NettyClientStateApplication; import wu.framework.lazy.cloud.heartbeat.server.application.assembler.NettyClientStateDTOAssembler; import wu.framework.lazy.cloud.heartbeat.server.application.command.netty.client.state.NettyClientStateStoryCommand; @@ -15,6 +19,7 @@ import com.wu.framework.inner.lazy.database.expand.database.persistence.domain.L import com.wu.framework.response.Result; import jakarta.annotation.Resource; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.stream.Collectors; /** @@ -143,4 +148,28 @@ public class NettyClientStateApplicationImpl implements NettyClientStateApplicat return nettyClientStateRepository.remove(nettyClientState); } + /** + * 通过客户端心跳通道发送客户端请求 + * + * @param nettyClientMessageCommand 发送请求到客户端 + * @return {@link Result} + */ + @Override + public Result sendMessage2HeartbeatClient(NettyClientMessageCommand nettyClientMessageCommand) { + // 获取客户端ID + String clientId = nettyClientMessageCommand.getClientId(); + String message = nettyClientMessageCommand.getMessage(); + ChannelContext.ClientChannel clientChannel = ChannelContext.get(clientId); + if(clientChannel==null){ + return ResultFactory.errorOf("客户端:"+clientId+"不存在"); + } + // 发送消息到客户端 + Channel channel = clientChannel.getChannel(); + NettyProxyMsg nettyProxyMsg = new NettyProxyMsg(); + nettyProxyMsg.setClientId("服务端"); + nettyProxyMsg.setData(message.getBytes(StandardCharsets.UTF_8)); + nettyProxyMsg.setType(MessageType.DISTRIBUTE_SINGLE_CLIENT_MESSAGE); + channel.writeAndFlush(nettyProxyMsg); + return ResultFactory.successOf(); + } } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/controller/NettyClientStateProvider.java b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/controller/NettyClientStateProvider.java index ff7b01c..67eaaa1 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/controller/NettyClientStateProvider.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/wu/framework/lazy/cloud/heartbeat/server/controller/NettyClientStateProvider.java @@ -136,4 +136,19 @@ public class NettyClientStateProvider { public Result remove(@ModelAttribute NettyClientStateRemoveCommand nettyClientStateRemoveCommand){ return nettyClientStateApplication.remove(nettyClientStateRemoveCommand); } + + /** + * describe 通过客户端心跳通道发送客户端请求 + * @param nettyClientMessageCommand 发送请求到客户端 + * @return {@link Result} + + * @author Jia wei Wu + * @date 2023/12/27 03:46 下午 + **/ + + @Operation(summary = "通过客户端心跳通道发送客户端请求") + @PostMapping("/sendMessage2HeartbeatClient") + public Result sendMessage2HeartbeatClient(@RequestBody NettyClientMessageCommand nettyClientMessageCommand){ + return nettyClientStateApplication.sendMessage2HeartbeatClient(nettyClientMessageCommand); + } } \ No newline at end of file diff --git a/wu-lazy-cloud-network-ui/src/api/modules/cloudNetwork.js b/wu-lazy-cloud-network-ui/src/api/modules/cloudNetwork.js index 9ab3d47..d493b7f 100644 --- a/wu-lazy-cloud-network-ui/src/api/modules/cloudNetwork.js +++ b/wu-lazy-cloud-network-ui/src/api/modules/cloudNetwork.js @@ -11,6 +11,10 @@ module.exports = { url: "/netty/client/state/remove", type: "delete", }, + sendMessage2HeartbeatClient: { + url: "/netty/client/state/sendMessage2HeartbeatClient", + type: "post", + }, visitorPage: { url: "/netty/server/visitor/findPage", type: "get", diff --git a/wu-lazy-cloud-network-ui/src/views/layoutpages/cloud_network/CloudClient.vue b/wu-lazy-cloud-network-ui/src/views/layoutpages/cloud_network/CloudClient.vue index 130faba..b01a3bc 100644 --- a/wu-lazy-cloud-network-ui/src/views/layoutpages/cloud_network/CloudClient.vue +++ b/wu-lazy-cloud-network-ui/src/views/layoutpages/cloud_network/CloudClient.vue @@ -63,9 +63,24 @@ > {{ buttons.del.name }} + + {{ buttons.sendMessage.name }} + + + + +