# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 3

利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket – 3

一、Tomcat专题 - WebSocket - 案例 - OnMessage分析

1、WebSocket DEMO 案例 实现流程分析:OnMessage 分析

tomcat-72.png

2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onMessage(String message, Session session) {…} 方法。分析流程。

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}@OnMessagepublic  void onMessage(String message, Session session) {//1. 获取客户端的信息内容, 并解析//2. 判定是否有接收人//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息//4. 不是all , 则给指定的用户推送消息}

二、Tomcat专题 - WebSocket - 案例 - OnMessage功能实现

1、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

完成 onMessage(String message, Session session) {…} 方法代码编写。

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}@OnMessagepublic  void onMessage(String message, Session session) throws IOException {System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );//1. 获取客户端的信息内容, 并解析Map<String,String> messageMap = JSON.parseObject(message, Map.class);String fromName = messageMap.get("fromName");String toName = messageMap.get("toName");String content = messageMap.get("content");//2. 判定是否有接收人if(toName == null || toName.isEmpty()){return;}//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);if("all".equals(toName)){//3.1 组装消息内容broadcastAllUsers(messageContent);}else{//4. 不是all , 则给指定的用户推送消息singlePushMessage(messageContent, fromName,toName);}}

2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 //给指定用户推送消息 private void singlePushMessage(String content, String fromName, String toName) throws IOException {…} 方法,并完成代码编写。

//给指定用户推送消息private void singlePushMessage(String content, String fromName, String toName) throws IOException {boolean isOnline = false;//1. 判定当然接收人是否在线for (HttpSession hsession : onlineUsers.keySet()) {if(toName.equals(hsession.getAttribute("username"))){isOnline = true;}}//2. 如果存在, 发送消息if(isOnline){for (HttpSession hsession : onlineUsers.keySet()) {if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){onlineUsers.get(hsession).session.getBasicRemote().sendText(content);}}}}

3、项目 dzs168_chat_room 中,websocket 类 ChatSocket.java 代码。


/***   project_tomcat\dzs168_chat_room\src\djh\it\websocket\ChatSocket.java**   2024-9-2 创建 websocket 类 ChatSocket.java*/package djh.it.websocket;import djh.it.utils.MessageUtil;
import com.alibaba.fastjson.JSON;import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class )
public class ChatSocket {private  Session session;private  HttpSession httpSession;//保存当前系统中登录的用户的HttpSession信息, 及对应的Endpoint实例信息private static Map<HttpSession , ChatSocket> onlineUsers = new HashMap<HttpSession, ChatSocket>();private static int onlineCount = 0;@OnOpenpublic void onOpen(Session session, EndpointConfig config){//1. 记录webSocket的会话信息对象Sessionthis.session = session;//2. 获取当前登录用户HttpSession信息.HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());this.httpSession = httpSession;System.out.println("当前登录用户 : " + httpSession.getAttribute("username") +", Endpoint : " +hashCode());//3. 记录当前登录用户信息, 及对应的Endpoint实例if (httpSession.getAttribute("username") != null){onlineUsers.put(httpSession,this);}//4. 获取当前所有登录用户 --------> DZS168,dzs,TOM...String names = getNames();//5. 组装消息 ---> {"data":"dzs168,Deng,study","toName":"","fromName":"","type":"user"}String message = MessageUtil.getContent(MessageUtil.TYPE_USER, "", "", names);//6. 通过广播的形式发送消息//session.getBasicRemote().sendText("");broadcastAllUsers(message);//7. 记录当前用户登录数 .incrCount();}//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}@OnMessagepublic  void onMessage(String message, Session session) throws IOException {System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );//1. 获取客户端的信息内容, 并解析Map<String,String> messageMap = JSON.parseObject(message, Map.class);String fromName = messageMap.get("fromName");String toName = messageMap.get("toName");String content = messageMap.get("content");//2. 判定是否有接收人if(toName == null || toName.isEmpty()){return;}//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);if("all".equals(toName)){//3.1 组装消息内容broadcastAllUsers(messageContent);}else{//4. 不是all , 则给指定的用户推送消息singlePushMessage(messageContent, fromName,toName);}}//给指定用户推送消息private void singlePushMessage(String content, String fromName, String toName) throws IOException {boolean isOnline = false;//1. 判定当然接收人是否在线for (HttpSession hsession : onlineUsers.keySet()) {if(toName.equals(hsession.getAttribute("username"))){isOnline = true;}}//2. 如果存在, 发送消息if(isOnline){for (HttpSession hsession : onlineUsers.keySet()) {if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){onlineUsers.get(hsession).session.getBasicRemote().sendText(content);}}}}// 发送广播消息private void broadcastAllUsers(String message) {for (HttpSession hsession : onlineUsers.keySet()) {try {onlineUsers.get(hsession).session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}//获取所有的在线用户private String getNames() {String names = "";if(onlineUsers.size()>0){for (HttpSession hsession : onlineUsers.keySet()) {String username = (String) hsession.getAttribute("username");names += username+",";}}return names.substring(0,names.length()-1);}public int getOnlineCount(){return onlineCount;}public synchronized void incrCount(){onlineCount ++;}public synchronized void decrCount(){onlineCount --;}}

三、Tomcat专题 - WebSocket - 案例 - OnMessage功能测试

1、项目 dzs168_chat_room 中,前端源码 chat.jsp 页面。


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="format-detection" content="telephone=no"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-capable" content="yes"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="yes" name="apple-touch-fullscreen"><meta name="full-screen" content="yes"><meta content="default" name="apple-mobile-web-app-status-bar-style"><meta name="screen-orientation" content="portrait"><meta name="browsermode" content="application"><meta name="msapplication-tap-highlight" content="no"><meta name="x5-orientation" content="portrait"><meta name="x5-fullscreen" content="true"><meta name="x5-page-mode" content="app"><base target="_blank"><title>段子手168-聊天室</title><link href="css/bootstrap.min.css" rel="stylesheet" type="text/css"/><link rel="stylesheet" href="css/chat.css"><script src="js/jquery-1.9.1.min.js"></script><script type="text/javascript"><%String name = session.getAttribute("username")+"";%>var self = "<%= name %>";</script><script type="text/javascript" src="js/ws.js"></script>
</head><body  onload="startWebSocket(self);"><img style="width:100%;height:100%" src="img/chat_bg.jpg"><div class="abs cover contaniner"><div class="abs cover pnl"><div class="top pnl-head" style="padding: 20px ; color: white;" id="userName"></div><div class="abs cover pnl-body" id="pnlBody"><div class="abs cover pnl-left"><div class="abs cover pnl-msgs scroll" id="show"><div class="pnl-list" id="hists"><!-- 历史消息 --></div><div class="pnl-list" id="msgs"><!-- 消息这展示区域 --></div></div><div class="abs bottom pnl-text"><div class="abs cover pnl-input"><textarea class="scroll" id="context_text" onkeydown="sendMessage(self)" wrap="hard" placeholder="在此输入文字信息..."></textarea><div class="abs atcom-pnl scroll hide" id="atcomPnl"><ul class="atcom" id="atcom"></ul></div></div><div class="abs br pnl-btn" id="submit" style="background-color: rgb(32, 196, 202); color: rgb(255, 255, 255);" onclick="sendMsg(self)">发送</div><div class="pnl-support" id="copyright"><a href="http://www.itcast.cn">段子手168,版本所有</a></div></div></div><div class="abs right pnl-right"><div class="slider-container hide"></div><div class="pnl-right-content"><div class="pnl-tabs"><div class="tab-btn active" id="hot-tab">好友列表</div></div><div class="pnl-hot"><ul class="rel-list unselect" id="userlist"></ul></div></div><div class="pnl-right-content"><div class="pnl-tabs"><div class="tab-btn active">系统广播</div></div><div class="pnl-hot"><ul class="rel-list unselect" id="broadcastList"></ul></div></div></div></div></div>
</div>
</body>
</html>
<!-- project_tomcat\dzs168_chat_room\web\chat.jsp -->

2、项目 dzs168_chat_room 中,前端源码 login.jsp 页面。


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="en">
<head><title>段子手聊天室——登录</title><meta name="viewport" content="width=device-width, initial-scale=1"/><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="keywords"content="Transparent Sign In Form Responsive Widget,Login form widgets, Sign up Web forms , Login signup Responsive web form,Flat Pricing table,Flat Drop downs,Registration Forms,News letter Forms,Elements"/><script type="application/x-javascript">addEventListener("load", function () {setTimeout(hideURLbar, 0);}, false);function hideURLbar() {window.scrollTo(0, 1);}</script><script src="js/jquery-1.9.1.min.js"></script><link rel="icon" href="img/chat.ico" type="image/x-icon"/><link rel="stylesheet" href="css/font-awesome.css"/> <!-- Font-Awesome-Icons-CSS --><link rel="stylesheet" href="css/login.css" type="text/css" media="all"/> <!-- Style-CSS -->
</head><body class="background">
<div class="header-w3l"><h1>段子手168聊天室</h1>
</div>
<div class="main-content-agile"><div class="sub-main-w3"><h2>登录</h2><form><div class="icon1"><input placeholder="用户名" id="username" type="text"/></div><div class="icon2"><input placeholder="密码" id="password" type="password"/></div><div class="clear"></div><input type="button" value="登录" onclick="login()"/></form></div>
</div>
<div class="footer"><p>段子手168 版权所有Copyright 2024-9-1  All Rights Reserved </p>
</div>
</body>
<script type="text/javascript">function login() {$.ajax({type: 'POST',url: '/login',dataType: 'json',data: {username: $("#username").val(),password: $("#password").val()},success: function (data) {if (data.success) {window.location.href = "chat.jsp";} else {alert(data.message);}}});}</script>
</html>
<!-- project_tomcat\dzs168_chat_room\web\login.jsp -->

3、项目 dzs168_chat_room 中,//定义全局的webSocket对象 ws.js 源码。

…\project_tomcat\dzs168_chat_room\web\js\ws.js

//定义全局的webSocket对象
var ws = null;function startWebSocket(self) {//构建WebSocket对象if ('WebSocket' in window) {ws = new WebSocket("ws://localhost:8080/websocket");} else if ('MozWebSocket' in window) {ws = new MozWebSocket("ws://localhost:8080/websocket");} else {alert("not support");}//监听消息, 有消息传递, 会触发此方法ws.onmessage = function (evt) {var _data = evt.data;console.log(">> : " + _data);var o = JSON.parse(_data);if (o.type == 'message') { //如果后端, 响应的是消息, 在页面展示setMessageInnerHTML(o, self);} else if (o.type == 'user') { // 如果服务端响应的是用户列表, 在界面展示用户列表var userArry = o.data.split(',');$("#userlist").empty();$("#userlist").append('<li class="rel-item"><input type="radio" name="toUser" value="all">广播</input></li>');$.each(userArry, function (n, value) {if (value != self && value != 'admin') {$("#userlist").append('<li class="rel-item"><input type="radio"  name="toUser" value="'+value+'">'+value+'</input></li>');$("#broadcastList").append('<li class="rel-item">您的好友 '+value+' 已上线</li>');}});}};//关闭链接时触发ws.onclose = function (evt) {$('#userName').html("用户: "+ self +"<span style='float: right;color: red'>离线</span>");};//打开时触发ws.onopen = function (evt) {$('#userName').html("用户: "+ self +"<span style='float: right;color: green'>在线</span>");};
}function setMessageInnerHTML(msg, self) {//根据后台响应的数据, 判定是展示在左侧还是右侧.var str = "";if(msg.toName == 'all'){$("#broadcastList").append('<li class="rel-item"> 系统广播消息: '+msg.data+' </li>');}else if (msg.fromName == self) {str = "<div class=\"msg guest\"><div class=\"msg-right\"><div class=\"msg-host headDefault\"></div><div class=\"msg-ball\" title=\"今天 17:52:06\">" + msg.data + "</div></div></div>"} else if(msg.toName == self){str = "<div class=\"msg robot\"><div class=\"msg-left\" worker=\"" + msg.fromName + "\"><div class=\"msg-host photo\" style=\"background-image: url(../img/avatar/Member002.jpg)\"></div><div class=\"msg-ball\" title=\"今天 17:52:06\">" + msg.data + "</div></div></div>";}//获取到现有的内容, 追加新的消息内容var msgs = document.getElementById("msgs");msgs.innerHTML = msgs.innerHTML + str;//判定消息来源的用户 , 勾选对应的好友信息var a = $('input[name="toUser"]');for(var i=0 ; i < a.length ; i++){if(a[i].value == msg.fromName){console.log(a[i]);a[i].checked='checked';}}
}// 组装消息, 发送消息
function sendMsg(self) {var content = $("#context_text").val();if(!content){alert('请输入消息内容');return ;}var message = {};message.fromName = self;message.toName = $('input:radio:checked').val();  //根据界面勾选的用户, 来决定消息发送给谁message.content = content; //获取输入文本框中输入的内容var msg = JSON.stringify(message);console.log(" msg: "+msg);ws.send(msg);//发送消息$("#context_text").val(''); //将输入框内容置为空
}function sendMessage(self){if(event.keyCode == 13){sendMsg(self);}
}

4、运行 tomcat 服务,进行测试。

5、多个 浏览器地址栏输入:localhost:8080/ 登录几个不同用户,进行测试。

tomcat-78.png

tomcat-79.png

四、Tomcat专题 - WebSocket - 案例 - OnClose及OnError介绍

1、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onClose(Session session, CloseReason closeReason){…} 方法。

@OnClosepublic void onClose(Session session, CloseReason closeReason){decrCount();System.out.println("客户端关闭了一个连接 , 当前在线人数 : " + getOnlineCount());}

2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onError(Session session, Throwable throwable){…} 方法。

@OnErrorpublic void onError(Session session, Throwable throwable){throwable.printStackTrace();System.out.println("服务异常");}

3、项目 dzs168_chat_room 中,websocket 类 ChatSocket.java 代码。


/***   project_tomcat\dzs168_chat_room\src\djh\it\websocket\ChatSocket.java**   2024-9-2 创建 websocket 类 ChatSocket.java*/package djh.it.websocket;import djh.it.utils.MessageUtil;
import com.alibaba.fastjson.JSON;import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class )
public class ChatSocket {private  Session session;private  HttpSession httpSession;//保存当前系统中登录的用户的HttpSession信息, 及对应的Endpoint实例信息private static Map<HttpSession , ChatSocket> onlineUsers = new HashMap<HttpSession, ChatSocket>();private static int onlineCount = 0;@OnOpenpublic void onOpen(Session session, EndpointConfig config){//1. 记录webSocket的会话信息对象Sessionthis.session = session;//2. 获取当前登录用户HttpSession信息.HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());this.httpSession = httpSession;System.out.println("当前登录用户 : " + httpSession.getAttribute("username") +", Endpoint : " +hashCode());//3. 记录当前登录用户信息, 及对应的Endpoint实例if (httpSession.getAttribute("username") != null){onlineUsers.put(httpSession,this);}//4. 获取当前所有登录用户 --------> DZS168,dzs,TOM...String names = getNames();//5. 组装消息 ---> {"data":"dzs168,Deng,study","toName":"","fromName":"","type":"user"}String message = MessageUtil.getContent(MessageUtil.TYPE_USER, "", "", names);//6. 通过广播的形式发送消息//session.getBasicRemote().sendText("");broadcastAllUsers(message);//7. 记录当前用户登录数 .incrCount();}//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}@OnMessagepublic  void onMessage(String message, Session session) throws IOException {System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );//1. 获取客户端的信息内容, 并解析Map<String,String> messageMap = JSON.parseObject(message, Map.class);String fromName = messageMap.get("fromName");String toName = messageMap.get("toName");String content = messageMap.get("content");//2. 判定是否有接收人if(toName == null || toName.isEmpty()){return;}//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);if("all".equals(toName)){//3.1 组装消息内容broadcastAllUsers(messageContent);}else{//4. 不是all , 则给指定的用户推送消息singlePushMessage(messageContent, fromName,toName);}}//给指定用户推送消息private void singlePushMessage(String content, String fromName, String toName) throws IOException {boolean isOnline = false;//1. 判定当然接收人是否在线for (HttpSession hsession : onlineUsers.keySet()) {if(toName.equals(hsession.getAttribute("username"))){isOnline = true;}}//2. 如果存在, 发送消息if(isOnline){for (HttpSession hsession : onlineUsers.keySet()) {if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){onlineUsers.get(hsession).session.getBasicRemote().sendText(content);}}}}// 发送广播消息private void broadcastAllUsers(String message) {for (HttpSession hsession : onlineUsers.keySet()) {try {onlineUsers.get(hsession).session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}//获取所有的在线用户private String getNames() {String names = "";if(onlineUsers.size()>0){for (HttpSession hsession : onlineUsers.keySet()) {String username = (String) hsession.getAttribute("username");names += username+",";}}return names.substring(0,names.length()-1);}@OnClosepublic void onClose(Session session, CloseReason closeReason){decrCount();System.out.println("客户端关闭了一个连接 , 当前在线人数 : " + getOnlineCount());}@OnErrorpublic void onError(Session session, Throwable throwable){throwable.printStackTrace();System.out.println("服务异常");}public int getOnlineCount(){return onlineCount;}public synchronized void incrCount(){onlineCount ++;}public synchronized void decrCount(){onlineCount --;}}

4、重新运行 tomcat 服务,多个 浏览器地址栏输入:localhost:8080/ 登录几个不同用户,再退出登录,进行测试。

tomcat-80.png

tomcat-81.png

上一节关联链接请点击

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能-- WebSocket – 1

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能-- WebSocket – 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426550.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP-CCF★★★201903-2二十四点★★★

目录 一、问题描述 二、解答 方法一&#xff1a;穷举法&#xff08;只列举了一部分&#xff09; 方法二&#xff1a;中缀表达式直接求值&#xff0c;两个栈&#xff0c;一个存放数值&#xff0c;一个存放符号 方法三&#xff1a;将中缀表达式转换为后缀来计算注意&#xff…

SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理

文章目录 前言1、工程包结构2、POM依赖3、Java代码 前言 本篇主要针对前后端分离的项目&#xff0c;做的一个统一响应包装、统一异常捕获处理。 在Spring里&#xff0c;我们可以使用ControllerAdvice来声明一些关于controller的全局性的东西&#xff0c;其用法主要有以下三点…

建模杂谈系列256 规则函数化改造

说明 之前尝试用FastAPI来构造规则&#xff0c;碰到的问题是由于请求量过大(TPS > 1000), 从而导致微服务端口资源耗尽。所以现在的point是: 1 如何使用函数来替代微服务(同时要保留使用微服务的优点)2 进一步抽象并规范规则的执行3 等效合并规则的方法 内容 0 机制讨论…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分&#xff1a;离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理&#xff0c;以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

【算法】动态规划—最长回文子序列

思路分析 关于”回文串“的问题&#xff0c;是面试中常见的&#xff0c;本文提升难度&#xff0c;讲一讲”最长回文子序列“问题&#xff0c;题目很好理解&#xff1a; 输入一个字符串 s&#xff0c;请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

WSL中使用AMBER GPU串行版

前提是已经安装过wsl 1 在 WSL 2 中启用 NVIDIA CUDA 参考在 WSL 2 上启用 NVIDIA CUDA | Microsoft Learn 注意&#xff1a;勿在 WSL 中安装任何 Linux 显示驱动程序。Windows 显示驱动程序将同时安装本机 Windows 和 WSL 支持的常规驱动程序组件。 2 在WSL2中配置Cuda 不安…

5G毫米波阵列天线仿真——CDF计算(手动AC远场)

之前写过两个关于阵列天线获取CDF的方法&#xff0c;一个通过Realized Gain&#xff0c;一个通过Power Flow&#xff0c; 三个案例中都是3D中直接波束扫描&#xff0c;并没有展示场路结合的情况。这期我们用Power Flow的方法&#xff0c;手动合并AC任务的波束计算CDF。 还是用…

Linux(7)--目录文件的创建、删除、移动、复制、重命名

文章目录 1. 创建目录、文件2. 删除目录、文件3. 移动目录、文件4. 复制目录、文件5. 重命名目录、文件 1. 创建目录、文件 使用mkdir创建目录&#xff1a; 使用touch创建文件&#xff1a; 2. 删除目录、文件 使用rm可以删除文件: 使用rm -f可以强制删除文件&#xff0c;…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】

目录 Linux权限理解1.Xshell命令以及运行原理2.linux权限的学习2.1linux权限的切换2.2linux权限的概念2.3linux权限管理2.3.1linux中文件访问者的分类2.3.2文件类型和访问权限(文件属性)2.3.2.1文件类型2.3.2.2文件权限拓展—文件的起始权限 2.3.3文件权限管理2.3.4文件权限的应…

一文搞定WeakHashMap

写在前面 在缓存场景下&#xff0c;由于内存是有限的&#xff0c;不能缓存所有对象&#xff0c;因此就需要一定的删除机制&#xff0c;淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略&#xff0c;目前也有一些优秀的包提供了功能丰富的Cache&#xff0c;比如…

十八,Spring Boot 整合 MyBatis-Plus 的详细配置

十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置 文章目录 十八&#xff0c;Spring Boot 整合 MyBatis-Plus 的详细配置1. MyBatis-Plus 的基本介绍2. Spring Boot 整合 MyBatis Plus 的详细配置3. Spring Boot 整合 MyBatis plus 注意事项和细节4. MyBatisx 插件的…

浅谈红外测温技术在变电站运维中的应用

0引言 随着市场经济的繁荣发展&#xff0c;社会对电力的需求持续增长。城市供电网络的规模和用电设备的总量也在不断扩大&#xff0c;这导致城市电力系统中潜在的网络安全隐患日益增多。作为电力系统核心组成部分的变压器&#xff0c;其安全、稳定的工作直接关系到电能的质量和…

总结拓展十:SAP开发计划(上)

第一节 功能开发说明书介绍 1、功能开发的基础分类 报表查询开发单据打印开发功能开发增强开发接口开发 2、屏幕元素介绍 ——程序屏幕是SAP系统与用户之间的桥梁&#xff0c;屏幕由各种不同元素布局组成 示例&#xff1a;选择屏幕界面 单选输入框 多选输入框 设定默认…

静态库 动态库

https://blog.csdn.net/mahoon411/article/details/113565482 库&#xff1a;可执行代码的二进制文件&#xff0c;里面有可以直接使用的函数&#xff0c;变量等&#xff1b;不能单独运行 因为 Linux 和 Win 的链接器、汇编器、编译器的不同&#xff0c;相同代码的库不同 Lin…

k8s介绍及部署

目录 一 Kubernetes 简介及部署方法 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.4.1 K8S各个组件用途 1.4.2 K8S 各组件之间的调用关系 1.4.3 K8S 的 常用名词感念 1.4.4 k8S的分层架构 二 K8S集群环境搭建 2.1 k8s中容器的管…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

[数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;948 标注数量(xml文件个数)&#xff1a;948 标注数量(txt文件个数)&#xff1a;948 标注类别…

MySQL系列—12.Undo log

1、概念 DML 操作导致数据变化 , 将变化前的记录写入 Undo 日志。 作用 用于记录更改前的一份 copy &#xff0c;在操作出错时&#xff0c;可以用于回滚、撤销还原&#xff0c;只将数据库 逻辑地恢复到原来的样子 你 插入一条记录时&#xff0c;至少要把这条记录的主键值记下来…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…