Tomcat安装和配置以及多实例部署(附脚本)

TOMCAT详细部署

    • Tomcat服务器简介
      • 核心组件
      • Tomcat 各组件及关系
      • 工作流程
    • Tomcat server.xml 配置详解
      • server
      • service
      • Connector
      • Engine
      • Host
      • Context
      • Valve 阀门
    • Tomcat部署与安装
      • 部署脚本
      • 主要目录说明
    • Tomcat多实例部署
      • 扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数

Tomcat服务器简介

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

概括:
1)免费的、开放源代码的Web应用服务器
2)Apache软件基金会(Apache Software Foundation)Jakarta项目中的一个核心项目
3)由Apache、Sun和一些公司及个人共同开发而成
4)深受Java爱好者的喜爱,并得到部分软件开发商的认可
5)目前比较流行的Web应用服务器
在这里插入图片描述
Apache和Tomcat的区别在于

  • Apache是一个普通的HTTP服务器,主要用于静态网页的访问和处理。
  • Tomcat是一个更强大的应用服务器,主要用于动态网页的访问和处理。
  • Apache不能解释java程序(jsp,serverlet)。
  • Tomcat支持HTML、JSP、ASP、PHP、CGI等。
  • 在独立运行模式下,Tomcat的功能与Apache等效,支持JSP。

核心组件

1.Java Servlet
运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。与CGI(公共网关接口)功能相类似。

2.JSP全称Java Server Pages
一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。 JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

3.Tomcat三大核心组件
Tomcat 由一系列的组件构成,其中核心的组件有三个

Web容器:完成Web服务器的功能。
Servlet 容器:名字为catalina, 用于处理Servlet代码。
JSP容器:用于将JSP动态网页翻译成Servlet代码。

Tomcat 各组件及关系

  • Server 和 Service

  • Connector 连接器

    • HTTP 1.1
    • SSL https
    • AJP( Apache JServ Protocol) apache 私有协议,用于apache反向代理Tomcat
  • Container

    • Engine 引擎 catalina
    • Host 虚拟机 基于域名 分发请求
    • Context 隔离各个WEB应用 每个Context的 ClassLoader都是独立
  • Component

    • Manager (管理器)
    • logger (日志管理)
    • loader (载入器)
    • pipeline (管道)
    • valve (管道中的阀)
      在这里插入图片描述

工作流程

  1. 用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
  2. Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
  3. 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
  4. 执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
    在这里插入图片描述

Tomcat server.xml 配置详解

server

root元素:server 的顶级配置 主要属性: port:执行关闭命令的端口号 shutdown:关闭命令

演示shutdown的用法 #基于telent 执行SHUTDOWN 命令即可关闭(必须大写) telnet 127.0.0.1 8005 SHUTDOWN

service

服务:将多个connector 与一个Engine组合成一个服务,可以配置多个服务。

Connector

连接器:用于接收 指定协议下的连接 并指定给唯一的Engine 进行处理。 主要属性:

protocol 监听的协议,默认是http/1.1
port 指定服务器端要创建的端口号
minSpareThreads服务器启动时创建的处理请求的线程数
maxThreads 最大可以创建的处理请求的线程数
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)
SSLEnabled 是否开启 sll 验证,在Https 访问时需要开启。生成证书: keytool -genkey -v -alias testKey -keyalg RSA -validity 3650
-keystore D:\test.keystore
[ ] 演示配置多个Connector

<Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol"
                connectionTimeout="20000"
                redirectPort="8862"
                URIEncoding="UTF-8"
                useBodyEncodingForURI="true"
                compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"
                maxThreads="1024" minSpareThreads="200"
                acceptCount="800"
                maxConnections="10000"
                enableLookups="false"
        />

Engine

引擎:用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。 主要属性:name 引擎名称 defaultHost 默认host

Host

虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost.

 <Host name="localhost"  appBase="webapps"
     unpackWARs="true" autoDeploy="true">
     
</Host>

appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为/usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于
appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false

Context

应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。

Valve 阀门

可以理解成过滤器,具体配置要基于具体的Valve 接口的子类。以下即为一个访问日志的Valve

Tomcat部署与安装

部署脚本

#!/bin/bash
# 切换到/opt目录
cd /opt
# 安装Java Development Kit (JDK) 8
rpm -ivh jdk-8u371-linux-x64.rpm
# 向环境变量配置文件中添加Java环境变量
echo "export JAVA_HOME=/usr/java/jdk1.8.0-x64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH" >>etc/profile.d/java.sh
# 使环境变量配置立即生效
sourse /etc/profile.d/java.sh
# 切换到/opt目录,解压Apache Tomcat 9
cd /opt
tar zxvf apache-tomcat-9.0.78.tar.gz
# 将解压的Tomcat移动到/usr/local/tomcat下
mv -f apache-tomcat-9.0.78 /usr/local/tomcat
# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
# 检查Tomcat启动是否成功
if [ $? -eq 0 ]; then
    echo "tomcat启动成功"
else
    echo "tomcat启动失败"
fi

# 在Tomcat的webapps目录下创建kgc和benet应用目录
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
# 向kgc和benet应用目录下的index.jsp文件写入内容
echo "This is kgc page\!" >/usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" >/usr/local/tomcat/webapps/benet/index.jsp

# 更新Tomcat的server.xml配置文件,以添加对kgc和benet域名的配置
# 创建临时文件来存储更新后的配置
temp_file=$(mktemp)
# 使用sed命令将配置插入到临时文件中
sed "160a\\t<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">\n\t<Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true"\n\t/>\n\t</Host>\n\t<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">\n<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true"\n/>\n</Host>" /usr/local/tomcat/conf/server.xml >"$temp_file" &&
    # 检查是否成功写入临时文件
    if [ $? -eq 0 ]; then
        # 在替换原始配置文件之前创建一个备份
        cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.bak
        # 替换原始配置文件
        mv -f "$temp_file" /usr/local/tomcat/conf/server.xml &&
            echo "Configuration updated successfully."
    else
        # 如果写入临时文件失败,记录错误消息并清理临时文件
        echo "Failed to update configuration."
        rm "$temp_file"
    fi
# 重写kgc和benet应用目录下的index.jsp文件内容,确保内容是最新的
echo "This is kgc page\!" >/usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" >/usr/local/tomcat/webapps/benet/index.jsp
# 获取本地eth0网卡的IP地址,并将其与kgc和benet域名一起添加到hosts文件中
local_ip=$(ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d '/' -f 1)
echo "$local_ip www.kgc.com www.benet.com" >> /etc/hosts
# 停止并重新启动Tomcat,以确保配置和内容更新生效
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh
# 验证kgc和benet应用是否可以通过域名访问
curl www.kgc.com:8080/kgc/index.jsp
curl www.benet.com:8080/benet/index.jsp

在这里插入图片描述

小知识
CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
dt.jar:是关于运行环境的类库,主要是可视化的 swing 的包。
tools.jar:主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等。
JDK :java development kit (java开发工具)
JRE :java runtime environment
(java运行时环境)
JVM :java virtual machine (java虚拟机),使java程序可以在多种平台上运行class文件。

主要目录说明

●bin:存放启动和关闭Tomcat的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
●conf:存放Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
① server.xml: Tomcat的主配置文件,包含Service,Connector,Engine,Realm,Valve,Hosts主组件的相关配置信息;
② context.xml:所有host的默认配置信息;
③ tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息,Tomcat自带的manager默认情况下会用到此文件,在Tomcat中添加/删除用户,为用户指|定角色等将通过编辑此文件实现;
④ web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的web应用程序提供包括MIME映射等默认配置信息;
●lib:存放Tomcat运行需要的库文件的jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的jar 包
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用部署目录
●work:Tomcat工作日录,存放jsp编译后产生的class文件,一般清除Tomcat缓存的时候会使用到
●src:存放Tomcat 的源代码
●doc:存放Tomcat文档

Tomcat多实例部署

#!/bin/bash

# 定义软件包名称和版本
jdk_package="jdk-8u371-linux-x64.rpm"
tomcat_package="apache-tomcat-9.0.78.tar.gz"
tomcat_version="9.0.78"
tomcat_base_dir="/usr/local/tomcat"

# 检查是否以root身份运行
if [ "$(id -u)" != "0" ]; then
  echo "Please run as root."
  exit 1
fi

# 检查软件包是否存在
if [ ! -f "/opt/${jdk_package}" ] || [ ! -f "/opt/${tomcat_package}" ]; then
  echo "JDK or Tomcat package not found. Please make sure ${jdk_package} and ${tomcat_package} are in /opt."
  exit 1
fi

# 安装JDK
rpm -ivh /opt/${jdk_package}

# 解压Tomcat
tar -xf /opt/${tomcat_package} -C /opt || { echo "Tomcat extraction failed."; exit 1; }

# 创建Tomcat目录并移动Tomcat
mkdir -p ${tomcat_base_dir} && mv -f /opt/apache-tomcat-${tomcat_version} ${tomcat_base_dir}/tomcat1 

# 复制Tomcat实例
cp -a ${tomcat_base_dir}/tomcat1 ${tomcat_base_dir}/tomcat2 || { echo "Tomcat copy failed."; exit 1; }

# 编辑环境变量文件
echo "export CATALINA_HOME1=${tomcat_base_dir}/tomcat1
export CATALINA_BASE1=${tomcat_base_dir}/tomcat1
export TOMCAT_HOME1=${tomcat_base_dir}/tomcat1
#tomcat2
export CATALINA_HOME2=${tomcat_base_dir}/tomcat2
export CATALINA_BASE2=${tomcat_base_dir}/tomcat2
export TOMCAT_HOME2=${tomcat_base_dir}/tomcat2" | tee -a /etc/profile.d/tomcat.sh && source /etc/profile.d/tomcat.sh || { echo "Environment variables configuration failed."; exit 1; }

# 修改Tomcat配置文件
sed -i.bak -e '22s/<Server port="8005" shutdown="SHUTDOWN">/<Server port="8006" shutdown="SHUTDOWN">/g' \
    -e 's/ port="8080" protocol="HTTP\/1.1">/ port="8080" protocol="HTTP\/1.1"/g' \
    -e 's/ port="8009"/ port="8010" /g' \
    $CATALINA_HOME2/conf/server.xml || { echo "Tomcat configuration failed."; exit 1; }

# 更新start.sh和shutdown.sh文件
for tomcat_instance in 1 2; do
    cat <<EOF > ${tomcat_base_dir}/tomcat${tomcat_instance}/bin/start.sh
export CATALINA_BASE=\${CATALINA_BASE${tomcat_instance}}
export CATALINA_HOME=\${CATALINA_HOME${tomcat_instance}}
export TOMCAT_HOME=\${TOMCAT_HOME${tomcat_instance}}
EOF

    cat <<EOF > ${tomcat_base_dir}/tomcat${tomcat_instance}/bin/shutdown.sh
export CATALINA_BASE=\${CATALINA_BASE${tomcat_instance}}
export CATALINA_HOME=\${CATALINA_HOME${tomcat_instance}}
export TOMCAT_HOME=\${TOMCAT_HOME${tomcat_instance}}
EOF
done
mkdir -p $CATALINA_HOME1/webapps/kgc
mkdir -p $CATALINA_HOME2/webapps/benet
echo "This is kgc page\!" >$CATALINA_HOME1/webapps/kgc/index.jsp
echo "This is benet page\!" >$CATALINA_HOME2/webapps/benet/index.jsp

# 启动Tomcat实例
${tomcat_base_dir}/tomcat1/bin/startup.sh || { echo "Tomcat 1 startup failed."; exit 1; }
${tomcat_base_dir}/tomcat2/bin/startup.sh || { echo "Tomcat 2 startup failed."; exit 1; }

echo "Tomcat 1 and Tomcat 2 started successfully."

在这里插入图片描述
在这里插入图片描述

扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数

通常情况下,catalina.sh 位于 Tomcat 安装目录的 bin 子目录下,如 /usr/local/tomcat/tomcat2/bin/catalina.sh

CATALINA_OPTS="-server \
                -Xms2048m -Xmx2048m \
                -Xmn512m \
                -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m \
                -XX:NewRatio=3 \
                -XX:SurvivorRatio=8 \
                -XX:+UseG1GC \
                -XX:MaxGCPauseMillis=200 \
                -XX:InitiatingHeapOccupancyPercent=70 \
                -XX:+PrintGCDetails \
                -XX:+PrintGCDateStamps \
                -XX:+PrintGCCause \
                -Xloggc:/var/log/tomcat/tomcat_gc.log \
                -Djava.awt.headless=true \
                -Dcom.sun.management.jmxremote.port=10086 \
                -Dcom.sun.management.jmxremote.ssl=false \
                -Dcom.sun.management.jmxremote.authenticate=false"
-server: 启用服务器模式的 JVM。
-Xms 和 -Xmx: 分别设置堆的初始大小和最大大小,保持一致可以减少堆大小调整带来的开销。
-Xmn: 设置年轻代(Young Generation)大小。
-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize: 设置元空间(MetaSpace,取代了 PermGen)的初始和最大大小。
-XX:NewRatio: 设置老年代与年轻代的大小比例。
-XX:SurvivorRatio: 设置 Eden 区与 Survivor 区的大小比例。
-XX:+UseG1GC: 使用 G1 垃圾收集器,根据实际需求可选用其他适合的 GC 策略。
-XX:MaxGCPauseMillis: 设置期望的最大 GC 停顿时间。
-XX:InitiatingHeapOccupancyPercent: 设置触发并发标记周期的堆占用百分比。
-XX:+PrintGCDetails 等:开启详细的 GC 日志记录,便于分析和调优。
# 禁用显式gc
-XX:+DisableExplicitGC # 自动将System.gc() 调用转换成一个空操作,即应用中调用
System.gc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc()除
非是到了万不得已的情况下使用,都应该交给JVM。
-Xloggc: 设置 GC 日志文件路径。
-Djava.awt.headless=true: 防止在无图形界面环境中出现相关异常。
-Dcom.sun.management.jmxremote.*: 开启 JMX 远程监控,便于通过 JConsole 或其他工具监控 JVM 状态。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lt Redis变慢的原因及排查解决方法

前言 Redis 作为优秀的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单个实例的 OPS 能够达到 10W 左右(5-10W)。但也正因此如此&#xff0c;当我们在使用 Redis 时&#xff0c;如果发现操作延迟变大的情况&#xff0c;就会与我们的预期不符。 你也许或多或少地&…

LLaMA-Factory参数的解答(命令,单卡,预训练)

前面这个写过&#xff0c;但觉得写的不是很好&#xff0c;这次是参考命令运行脚本&#xff0c;讲解各个参数含义。后续尽可能会更新&#xff0c;可以关注一下专栏&#xff01;&#xff01; *这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数解读不对或…

一文扫盲:数据中台,可不是搞几个报表就叫中台。

Hi&#xff0c;我是贝格前端工场&#xff0c;相比大家会经常听说数据中台这个词汇&#xff0c;很多老铁会想当然的人为数据中台就是各种报表&#xff0c;本文给大家纠正和普及一下。 一、什么是数据中台 数据中台是指一个企业内部的数据管理和分发平台&#xff0c;它通过集中…

​解析什么是物联网接入网关?-天拓四方

随着物联网技术的飞速发展&#xff0c;越来越多的设备、传感器和系统被连接到互联网&#xff0c;形成了一个庞大的、相互连接的智能网络。在这个网络中&#xff0c;物联网接入网关扮演着至关重要的角色&#xff0c;它不仅是连接物联网设备和云平台的桥梁&#xff0c;还是实现设…

excel一列同乘同一个数

excel一列同乘同一个数 第一种方法&#xff08;excel本身功能&#xff09; 在空白区域输入要乘以的数&#xff0c;比如0.5 右键选择复制 选中需要乘以的单元格&#xff0c;选择性粘贴 点击乘&#xff0c;选择确定 删除0.5后也不会改变值 第二种方法&#xff08;方方格子…

STM32自己从零开始实操01:原理图

在听完老师关于 STM32 物联网项目的所有硬件课程之后&#xff0c;就是感觉自己云里雾里&#xff0c;明明课程都认真听完了&#xff0c;笔记也认真记录&#xff0c;但是就是感觉学到的知识还不是自己。 遂决定站在老师的肩膀上自己开始设计项目&#xff0c;将知识变成自己的&am…

Lagent AgentLego 智能体应用搭建-笔记六

本次课程由Lagent&AgentLego 核心贡献者樊奇老师讲解【Lagent & AgentLego 智能体应用搭建】课程 课程视频&#xff1a;https://www.bilibili.com/video/BV1Xt4217728/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp2/agent 大语言模型的局限…

MybatisPlus开发业务接口

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 MybatisPlus开发业务接口 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主…

(mac)Promethues监控之mysqld_exporter(MySQL监控)

搭建Mysqld_exporterPrometheusGrafana监控系统 普罗米修斯是后端数据监控平台&#xff0c;通过Mysqld_exporter收集mysql数据&#xff0c;Grafana将数据用图形的方式展示出来 前提&#xff1a;已安装grafana和promethues 1.下载安装Mysql &#xff08;1&#xff09;启动MySQL…

回到唐诗宋词的创作现场,与伟大诗词人的灵魂共振

一、教程前言 本套唐诗宋词教程&#xff0c;大小3.15G&#xff0c;1个压缩文件。 二、教程目录 1-读诗&#xff0c;或许可以让我们更加接近自己.mp4 2-漠漠水田飞白鹭——王维的自然世界.mp4 3-不知何处是他乡——李白的酒徒生涯.mp4 4-桃花流水窅然去——李白的轻盈写作…

异步日志方案spdlog

异步日志方案spdlog spdlog 是一款高效的 C 日志库&#xff0c;它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录&#xff0c;提供多种日志级别&#xff0c;并允许用户将日志输出到控制台、文件或自定义的接收器。 多线程使用和同步、异步日志没有关系是…

信号带宽和上升沿时间

我们在抽取高速信号的S参数时避不开的一个环节是设置仿真带宽&#xff0c;经常听到有人讲要设置基频&#xff08;奈奎斯特频率&#xff09;的4倍or 5倍带宽&#xff0c;如果是这样&#xff0c;就有一个问题&#xff1a;如果是56Gbps的NRZ信号&#xff0c;那仿真带宽真要设置到1…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

NAT网络地址转换实验(思科)

华为设备参考&#xff1a;NAT网络地址转换实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

Markdown 对勾符号

Markdown中根号符号不完美&#xff0c;少了上面一横&#xff0c;更像对勾&#xff1a;√ 输入&#xff1a; 即可显示为&#xff1a; 在 youtrack 上面的 KB 页面&#xff0c;也适用。 Markdown 对勾符号 - 文档交付 - iSharkFlyMarkdown中根号符号不完美&#xff0c;少了上面一…

配置Trunk

1、实验目的 通过本实验可以掌握&#xff1a; Native VLAN 的含义和配置。IEEE802.1q 封装。Trunk 配置和调试方法。 2、实验拓扑 配置 Trunk 的实验拓扑如下图所示。 3、实验步骤 3.1 在交换机S1、S2上创建 VLAN 并把端口划分到相应的VLAN中 &#xff08;1&#xff09;配…

【网络安全】HTTP协议 — 基础

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、万维网的诞生与发展​编辑 1.万维网的诞生与发展 2.HTTP协议诞生与发展 二、网络基础 1.TCP/IP分层传输 1&#xff09;TCP/IP协议 2&#xff09;封装与拆封 …

初步认识Vscode

4.26初步认识Vscode &#xff08;一&#xff09;快捷键的使用 1. 打开控制端 ctrl ~2. 结束终端 ctrl c3. 多行同时对齐输出 按住shift alt 光标多选4. 多行同时任意位置输出 按住alt 光标单点你想要输入的位置5. 代码太长了&#xff0c;想混行编辑 alt z6. 打开设置控制…

C++ AVL树

文章目录 AVL树的概念AVL树基本框架AVL树的插入AVL树的插入&#xff08;无旋转&#xff09;AVL树的插入&#xff08;旋转操作&#xff09;单旋双旋旋转代码 上面我们知道二叉搜索树在特殊情况下查找的时间复杂度为O(N), 所以为了解决二叉搜索树不稳定的问题&#xff0c;我们引入…

关于OSPF报文学习

目录 一.OSPF学习补充 &#xff08;1&#xff09;OSPF报文头部 &#xff08;2&#xff09;ospf建立邻居关系 1.Hello报文——建立邻居关系 2.hello报文头部 &#xff08;3&#xff09;OSPF建立邻接关系 1.发送DD报文 2.DD报文头部 &#xff08;4&#xff09;关于DR,BD…