当前位置: 首页 > news >正文

一文详细了解websocket应用以及连接断开的解决方案

文章目录

    • websocket
    • vite 热启动探索
    • websocket -心跳
    • websocket 事件监听
    • 应用过程中问题总结

websocket

  1. Websocket简介
    • 定义和工作原理
      • Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求 - 响应模式不同,它允许服务器主动向客户端推送数据。例如,在一个实时聊天应用中,当一个用户发送消息后,服务器可以立即将这条消息推送给其他相关用户,而不需要客户端不断地轮询服务器来检查是否有新消息。
      • 它的工作过程是这样的:首先,客户端通过发送一个HTTP请求来建立Websocket连接,这个请求包含特殊的请求头,表明这是一个Websocket升级请求。服务器收到请求后,如果支持Websocket协议,就会返回一个状态码为101(Switching Protocols)的响应,表示协议切换成功,之后双方就可以通过这个建立好的连接进行双向通信了。
    • 在浏览器中的应用场景
      • 实时数据更新场景,如金融数据的实时展示。股票价格是不断变化的,通过Websocket,浏览器可以实时接收服务器推送的最新股票价格数据,并更新页面上的显示内容。
      • 在线游戏也是典型的应用场景。游戏中的玩家状态更新、实时对战信息等都可以通过Websocket在服务器和浏览器之间快速传递,保证游戏的实时性和流畅性。
  2. Webpack与Vite在Vue项目中的基本情况
    • Webpack
      • 定义和功能:Webpack是一个模块打包工具。它可以将Vue项目中的各种资源(如JavaScript文件、CSS文件、图片等)视为模块,并根据配置规则将它们打包成一个或多个文件,用于在浏览器中高效地加载和运行。
      • 工作流程:它会从一个入口文件开始,递归地构建一个依赖关系图,这个依赖关系图包含了项目中所有模块之间的依赖关系。然后,根据配置中的加载器(loader)和插件(plugin)对这些模块进行处理,例如将ES6代码转换为ES5代码、将SASS文件转换为CSS文件等,最后将处理后的模块打包成最终的输出文件。
    • Vite
      • 定义和功能:Vite是一种新型的前端构建工具,它的主要特点是利用了浏览器原生的ES模块支持,在开发阶段提供了更快的冷启动速度和热模块替换(HMR)。在Vue项目中,Vite可以快速地启动开发服务器,并且能够高效地处理模块的更新。
      • 工作流程:在开发模式下,Vite不需要像Webpack那样打包整个项目,而是直接利用浏览器对ES模块的支持,当浏览器请求一个模块时,Vite会即时编译并返回这个模块的内容。在构建生产版本时,Vite也会进行一定程度的优化和打包,以确保项目在生产环境中的性能。
  3. 在运行Vue项目中连接Websocket的方式
    • 在Vue项目中使用原生Websocket API
      • 在Vue组件中,可以通过new WebSocket('ws://your - websocket - server - url')来创建一个Websocket连接。例如:
      export default {data() {return {socket: null,messages: []};},mounted() {this.socket = new WebSocket('ws://localhost:8080');this.socket.addEventListener('open', () => {console.log('Websocket connection opened');});this.socket.addEventListener('message', (event) => {this.messages.push(event.data);});this.socket.addEventListener('close', () => {console.log('Websocket connection closed');});}
      }
      
      • 上述代码在mounted生命周期钩子中创建了一个Websocket连接。当连接打开时,会在控制台打印一条消息;当收到消息时,会将消息内容添加到messages数组中;当连接关闭时,也会打印相应的消息。
    • 使用第三方库(如Socket.io)辅助连接(以Webpack为例)
      • 首先安装socket.io - client库,通过npm install socket.io-client
      • 然后在Vue组件中引入并使用:
      import io from'socket.io - client';
      export default {data() {return {socket: null,messages: []};},mounted() {this.socket = io('http://localhost:8080');this.socket.on('connect', () => {console.log('Socket.io connection established');});this.socket.on('message', (data) => {this.messages.push(data);});this.socket.on('disconnect', () => {console.log('Socket.io connection lost');});}
      }
      
      • 这里使用socket.io-client库来建立连接,它提供了更简洁的API和一些额外的功能,如自动重连等。在Webpack项目中,需要确保在webpack.config.js中正确配置了相关的加载器和插件,以处理引入的第三方库。
  4. Websocket应用更新相关内容(结合Webpack和Vite的热更新机制)
    • Webpack热模块替换(HMR)与Websocket更新配合
      • Webpack的HMR允许在运行时更新模块,而不需要刷新整个页面。当Websocket收到新的数据导致相关模块需要更新时,Webpack的HMR可以发挥作用。例如,在一个展示实时数据的图表组件中,当Websocket收到新的图表数据后,Webpack可以通过HMR更新这个图表组件,而保持页面的其他部分不变。
      • 实现方式是通过配置webpack - dev - server的HMR选项,并且在Vue组件中编写相应的代码来处理模块更新。在webpack.config.js中,需要添加如下配置:
      module.exports = {//...其他配置devServer: {hot: true}
      };
      
      • 然后在Vue组件中,可以使用module.hot.accept来处理模块更新。例如:
      if (module.hot) {module.hot.accept(['./components/Chart.vue'], () => {// 当Chart.vue模块更新时的处理逻辑console.log('Chart.vue has been updated');});
      }
      
    • Vite热模块替换与Websocket更新配合
      • Vite的HMR机制更加高效。当Websocket触发数据更新导致模块需要更新时,Vite会快速地更新对应的模块。在Vue项目中,Vite会自动识别组件的更新并进行热替换。
      • 例如,当Websocket收到新的数据并更新了一个组件的数据状态时,Vite会重新渲染这个组件。在代码中,不需要像Webpack那样显式地配置很多HMR相关的内容,因为Vite默认就支持高效的热模块替换。但是,在组件内部仍然需要正确地处理数据更新的逻辑,比如通过watch属性或者computed属性来更新DOM显示。例如:
      export default {data() {return {dataFromSocket: null};},watch: {dataFromSocket(newValue) {// 根据新的数据更新DOMconsole.log('Data from Websocket updated:', newValue);}},mounted() {// 假设这里是Websocket接收数据的逻辑this.socket.addEventListener('message', (event) => {this.dataFromSocket = event.data;});}
      }
      

vite 热启动探索

  1. Vite开发服务器端启动WebSocket连接
    • 启动过程
      • 当Vite启动开发服务器时,它会在内部初始化WebSocket服务器。这个过程是由Vite的核心代码完成的,具体来说是在服务端模块(通常基于Node.js)中实现的。Vite使用了一些底层的Node.js网络库来创建和管理WebSocket连接。
      • 例如,Vite可能会使用ws库(一个流行的Node.js WebSocket库)来建立服务器。在Vite的代码内部,大致会有如下的初始化步骤(简化代码):
      const WebSocket = require('ws');
      const wss = new WebSocket.Server({ port: 3000 }); // 假设端口为3000
      
    • 等待浏览器连接
      • 一旦WebSocket服务器建立,它就开始等待浏览器的连接请求。在这个阶段,服务器会监听指定的端口(如上述例子中的3000端口),并准备好处理浏览器发送过来的WebSocket连接请求。
      • 当浏览器请求连接时,服务器会进行一系列的握手操作来建立连接。这个握手过程是基于WebSocket协议标准的,包括交换一些协议头信息,以确保双方都支持WebSocket通信并且能够理解对方发送的消息。
  2. 浏览器端建立连接的方式
    • HTML页面中的脚本触发连接
      • 在Vite开发的项目中,浏览器会加载项目的HTML页面。在这个HTML页面中,通常会有一个JavaScript脚本(可能是在<script type="module">标签中)来触发与Vite开发服务器的WebSocket连接。
      • 例如,在Vite生成的HTML页面的<script>标签(或者是在入口的JavaScript模块中)可能会有这样的代码来建立连接:
      const socket = new WebSocket('ws://localhost:3000');
      
      • 这里的ws://localhost:3000是WebSocket连接的URL,其中localhost是开发服务器的主机名,3000是服务器监听的端口号。这个URL的格式是根据WebSocket协议规范来定义的,告诉浏览器要连接到哪个服务器和端口。
    • 连接事件处理
      • 当浏览器发起连接请求后,会触发一系列的事件。首先是open事件,在这个事件的处理函数中,可以进行一些初始化操作,比如向服务器发送一些初始信息或者设置一些连接相关的状态。例如:
      socket.addEventListener('open', () => {console.log('WebSocket connection opened');// 可以在这里向服务器发送初始消息,如客户端的一些环境信息等
      });
      
    • 接收和发送消息的机制
      • 一旦连接建立成功,浏览器和服务器就可以通过这个WebSocket连接进行双向通信。在浏览器端,可以通过send方法向服务器发送消息,例如:
      socket.send('This is a message from the browser');
      
      • 同时,浏览器需要监听服务器发送过来的消息。这是通过监听message事件来实现的,当服务器发送消息过来时,message事件会被触发,然后可以在事件处理函数中对消息进行处理,例如:
      socket.addEventListener('message', (event) => {const message = event.data;console.log('Received message:', message);// 根据收到的消息内容进行相应的操作,如更新组件等
      });
      
  3. Vite热更新中的消息传递与连接维护
    • 在Vite的热更新过程中,服务器(Vite开发服务器)会利用这个已经建立的WebSocket连接向浏览器发送更新消息。当一个Vue组件或者其他模块文件发生变化时,Vite会重新编译相关模块,并将更新消息(包含更新的模块路径、新的模块代码等内容)通过WebSocket发送给浏览器。
    • 浏览器收到更新消息后,会根据消息中的内容进行模块更新操作。这个过程中,WebSocket连接会一直保持开启状态,除非遇到网络问题、浏览器关闭或者开发服务器停止等情况。通过这种方式,Vite实现了高效的热更新推送机制,使得浏览器能够及时获取模块更新信息并进行相应的处理,从而提供流畅的开发体验。

websocket -心跳

  1. 理解心跳机制
    • 心跳机制的原理
      • 心跳机制是为了保持连接的活跃状态。在Websocket通信中,客户端和服务器之间会周期性地发送一个很小的消息(心跳包)来互相确认对方还在连接状态。例如,客户端每隔一段时间(如10秒)向服务器发送一个简单的消息,服务器收到后回复一个确认消息。如果客户端在一定时间内没有收到服务器的回复,就可以认为连接出现问题,从而触发重连。
    • 在Nginx中的应用场景
      • Nginx作为反向代理服务器,在处理Websocket连接时,心跳机制可以帮助检测连接的有效性。当后端的Websocket服务器和客户端之间的连接长时间没有数据传输时,Nginx可以通过心跳包来判断连接是否还正常,避免因为网络波动等原因导致连接被错误地断开。
  2. Nginx配置心跳检测相关指令
    • proxy_read_timeout和proxy_send_timeout
      • 功能说明proxy_read_timeout用于设置Nginx从后端服务器读取数据的超时时间,proxy_send_timeout用于设置Nginx向后端服务器发送数据的超时时间。这两个指令可以间接用于心跳检测。
      • 示例配置
      location /websocket {proxy_pass http://backend - websocket - server;proxy_read_timeout 60s;proxy_send_timeout 60s;
      }
      
      • 在上述配置中,Nginx在与后端Websocket服务器通信时,如果读取或发送数据超过60秒没有响应,就会认为连接出现问题。这个时间可以根据实际情况进行调整,例如,对于频繁发送心跳包的场景,可以适当缩短这个时间。
    • proxy_http_version和proxy_set_header
      • 功能说明proxy_http_version用于设置代理的HTTP版本,对于Websocket,需要设置为1.1,因为Websocket是基于HTTP/1.1协议升级而来的。proxy_set_header用于设置发送到后端服务器的请求头。在Websocket连接中,需要正确设置ConnectionUpgrade头来实现协议升级。
      • 示例配置
      location /websocket {proxy_pass http://backend - websocket - server;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_read_timeout 60s;proxy_send_timeout 60s;
      }
      
      • 这里通过设置proxy_http_versionproxy_set_header,正确地将客户端的Websocket升级请求转发到后端服务器,并且在心跳检测过程中,保证了协议的正确通信。
  3. 客户端和服务器端配合实现心跳机制
    • 客户端实现
      • 在客户端(如浏览器中的JavaScript代码),可以使用setInterval函数来定期发送心跳包。例如:
      let socket = new WebSocket('ws://your - websocket - url');
      socket.addEventListener('open', () => {setInterval(() => {socket.send('heartbeat');}, 10000); // 每隔10秒发送一个心跳包
      });
      socket.addEventListener('message', (event) => {if (event.data === 'heartbeat - ack') {console.log('Heartbeat received from server');}
      });
      
      • 上述代码在Websocket连接打开后,每隔10秒发送一个heartbeat消息作为心跳包。当收到服务器回复的heartbeat - ack消息时,会在控制台打印一条确认信息。
    • 服务器端实现(以Node.js为例)
      • 在服务器端(假设是基于Node.js的Websocket服务器),可以接收客户端的心跳包并回复确认消息。例如:
      const WebSocket = require('ws');
      const wss = new WebSocket.Server({ port: 8080 });
      wss.on('connection', (socket) => {socket.on('message', (message) => {if (message === 'heartbeat') {socket.send('heartbeat - ack');}});
      });
      
      • 这样,服务器收到客户端发送的heartbeat心跳包后,会发送heartbeat - ack消息进行回复,通过Nginx的心跳检测相关配置,就可以有效地减少因为连接超时而导致的重连情况。

websocket 事件监听

  1. open事件
    • 含义和触发时机
      • open事件在Websocket连接成功建立时触发。这意味着客户端和服务器之间的双向通信通道已经准备好,可以开始发送和接收消息。例如,当客户端发送了一个Websocket升级请求,服务器成功响应并完成协议切换后,open事件就会在客户端被触发。
    • 应用场景和示例代码(以浏览器端JavaScript为例)
      • 通常在open事件的处理函数中可以进行一些初始化操作,比如向服务器发送登录信息或者订阅某些频道。
      let socket = new WebSocket('ws://your - websocket - server - url');
      socket.addEventListener('open', () => {console.log('Websocket connection opened successfully.');// 向服务器发送登录信息let loginData = {username: 'user1',password: 'password1'};socket.send(JSON.stringify(loginData));
      });
      
  2. message事件
    • 含义和触发时机
      • message事件在客户端接收到服务器发送的消息或者服务器接收到客户端发送的消息时触发。无论是文本消息还是二进制消息都会触发这个事件。
    • 应用场景和示例代码(以浏览器端JavaScript为例)
      • 这个事件常用于接收和处理服务器推送的数据。例如,在一个实时聊天应用中,当服务器发送新的聊天消息时,message事件就会被触发,然后可以将消息显示在聊天界面上。
      let socket = new WebSocket('ws://your - websocket - server - url');
      socket.addEventListener('message', (event) => {let message = event.data;// 假设消息是JSON格式的聊天消息let chatMessage = JSON.parse(message);let chatBox = document.getElementById('chat - box');let newMessageElement = document.createElement('p');newMessageElement.textContent = chatMessage.sender + ': ' + chatMessage.content;chatBox.appendChild(newMessageElement);
      });
      
  3. close事件
    • 含义和触发时机
      • close事件在Websocket连接关闭时触发。连接关闭可能是由于多种原因,如服务器主动关闭、网络问题或者客户端主动调用close方法。
    • 应用场景和示例代码(以浏览器端JavaScript为例)
      • close事件的处理函数中,可以进行一些清理工作,比如清除定时器、释放资源或者提示用户连接已关闭。
      let socket = new WebSocket('ws://your - websocket - server - url');
      socket.close()
      socket.addEventListener('close', () => {console.log('Websocket connection closed.');// 清除可能存在的定时器(如心跳定时器)clearInterval(heartbeatTimer);// 提示用户let notification = document.createElement('div');notification.textContent = 'Websocket connection lost. Please try again later.';document.body.appendChild(notification);
      });
      
  4. error事件
    • 含义和触发时机
      • error事件在Websocket连接过程中出现错误时触发。这可能是由于网络故障、服务器故障或者协议错误等原因导致的。
    • 应用场景和示例代码(以浏览器端JavaScript为例)
      • 可以在error事件处理函数中记录错误信息,尝试重新连接或者向用户显示错误提示。
      let socket = new WebSocket('ws://your - websocket - server - url');
      socket.addEventListener('error', (event) => {console.error('Websocket error:', event);// 尝试重新连接reconnectWebSocket();
      });
      

应用过程中问题总结

  1. 连接建立问题

    • 问题描述
      • 无法成功建立Websocket连接是常见的问题。可能是由于网络配置、服务器设置或者客户端代码错误导致的。例如,防火墙阻止了Websocket协议通信,或者客户端请求的URL路径错误。
    • 解决方案
      • 检查网络和防火墙:确保网络畅通,并且防火墙允许Websocket协议(通常使用的端口是80或443用于通过HTTP/HTTPS升级,或者自定义端口如8080等)的通信。在服务器端,检查安全组设置(如果是云服务器)和防火墙规则,允许传入的Websocket连接请求。
      • 检查URL和协议升级请求:在客户端代码中,仔细检查Websocket连接的URL是否正确。同时,确保请求头中包含正确的协议升级信息(如Connection: upgradeUpgrade: websocket)。对于通过代理服务器(如Nginx)的情况,要正确配置代理服务器以支持Websocket协议升级。
  2. 连接稳定性问题

    • 问题描述
      • 连接在使用过程中频繁中断,可能是由于网络波动、服务器负载过高或者长时间没有数据传输导致连接被服务器或代理认为是空闲而关闭。
    • 解决方案
      • 实现心跳机制:在客户端和服务器端实现心跳机制,定期发送心跳包来保持连接活跃。例如,客户端每隔一定时间(如10 - 30秒)发送一个简单的心跳消息,服务器收到后回复确认消息。在服务器端(如使用Node.js的ws库)可以这样实现:
      const WebSocket = require('ws');
      const wss = new WebSocket.Server({ port: 8080 });
      wss.on('connection', (socket) => {socket.on('message', (message) => {if (message === 'heartbeat') {socket.send('heartbeat - ack');}});
      });
      
      • 在客户端(如浏览器中的JavaScript):
      let socket = new WebSocket('ws://your - websocket - url');
      socket.addEventListener('open', () => {setInterval(() => {socket.send('heartbeat');}, 10000); 
      });
      socket.addEventListener('message', (event) => {if (event.data === 'heartbeat - ack') {console.log('Heartbeat received from server');}
      });
      
      • 优化服务器配置:检查服务器的负载情况,如CPU、内存使用率等。如果服务器负载过高,考虑增加服务器资源(如升级服务器配置或者增加服务器实例)。同时,调整服务器端的连接超时设置,使其与心跳机制相匹配,避免因为超时而错误地关闭连接。
  3. 消息传输问题

    • 问题描述
      • 消息丢失或乱序是消息传输过程中可能出现的问题。消息丢失可能是因为网络故障或者服务器处理不当,乱序可能是由于网络延迟的差异或者多线程/多进程处理导致的。
    • 解决方案
      • 消息确认机制:在客户端发送消息后,等待服务器的确认消息。如果没有收到确认消息,可以考虑重新发送。在服务器端,确保消息处理逻辑正确,并且在成功处理消息后及时发送确认消息给客户端。例如,在客户端可以设置一个消息队列和定时器,对于未收到确认的消息进行重新发送:
      let messageQueue = [];
      let socket = new WebSocket('ws://your - websocket - url');
      socket.addEventListener('open', () => {// 发送消息function sendMessage(message) {socket.send(message);messageQueue.push(message);}// 接收确认消息socket.addEventListener('message', (event) => {if (event.data === 'message - ack') {let sentMessage = messageQueue.shift();console.log(`Message ${sentMessage} confirmed.`);}});
      });
      
      • 消息排序和缓存机制:如果发现消息乱序,可以在客户端和服务器端建立消息缓存和排序机制。例如,给每个消息添加一个序列号,客户端按照序列号发送消息,服务器端收到消息后按照序列号进行排序处理。
  4. 跨域问题

    • 问题描述
      • 当Websocket请求的源(Origin)与服务器的允许跨域策略不匹配时,会出现跨域问题。这是由于浏览器的同源策略限制导致的。
    • 解决方案
      • 服务器端配置跨域策略:在服务器端设置允许跨域的头信息。例如,在Node.js的Websocket服务器中,可以使用cors中间件来允许跨域请求:
      const express = require('express');
      const app = express();
      const http = require('http');
      const server = http.createServer(app);
      const { Server } = require('ws');
      const wss = new Server({ server });
      app.use(cors()); 
      
      • 对于其他服务器技术(如Java、Python等)也有相应的跨域处理方法,如在Java的Spring Boot中,可以通过配置@CrossOrigin注解来允许跨域的Websocket连接。

相关文章:

一文详细了解websocket应用以及连接断开的解决方案

文章目录 websocketvite 热启动探索websocket -心跳websocket 事件监听应用过程中问题总结 websocket Websocket简介 定义和工作原理 Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求 - 响应模式不同&#xff0c;它允许服务器主动向客户端推送数据。例…...

如何做含有identify抓信号的fpga版本(image或者Bit)

在数字的FPGA debug中除了ila就是identify了&#xff0c;identify是synopsys公司的RTL级的调试工具。要用起来idetify&#xff0c;第一步就是要做出含有identify的信号的FPGA版本&#xff0c;quartus的是image&#xff0c;Ximlinx的是Bit或者Bin文件。具体有以下几步&#xff1…...

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图

一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock&#xff0c;用户可以方便地使用多种基础模型&#xff08;Foundation Models&#xff09;&#xff0c;包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…...

【源码】Sharding-JDBC源码分析之SQL中分片键路由ShardingSQLRouter的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …...

蓝牙 AVRCP 协议详解

前言 随着无线音频设备的普及&#xff0c;蓝牙已经成为智能设备间通信的主流方式之一。除了传输音频流的 A2DP 协议外&#xff0c;AVRCP&#xff08;Audio/Video Remote Control Profile&#xff0c;音频/视频远程控制协议&#xff09;为用户提供了对蓝牙音频设备的控制能力&am…...

在 Ubuntu 18.04 上安装 MySQL 5.7和MySQL 8

1.Ubuntu安装MySQL 5.72.Ubuntu安装MySQL 8 在 Ubuntu 18.04 上安装 MySQL 5.7&#xff0c;可以按照以下步骤操作&#xff1a; 1. 更新系统包列表 运行以下命令以确保系统包列表是最新的&#xff1a; sudo apt update2. 检查默认 MySQL 版本 Ubuntu 18.04 默认提供 MySQL 5.…...

第4章 Spring Boot自动配置

自动配置概述 SpringBoot的两大核心 Spring Boot 框架的两大核心特性可以概括为“启动器”&#xff08;Starter&#xff09;和“自动配置”&#xff08;Auto-configuration&#xff09;。 启动器&#xff08;Starter&#xff09;&#xff1a; Spring Boot 提供了一系列的 Star…...

显存:存储,GPU:计算;Pipeline Parallelism(管道并行)

目录 显存:存储,GPU:计算 流水线切分策略:(数据并并,多头并行,单头MLP切片) 存储(显存)和计算(GPU)负载不均衡的问题 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 解决办法:重计算和流水线切分策略 重计算策略: 流水线切分策略:…...

费曼路径积分简单示例

费曼路径积分简单示例 费曼路径积分是量子力学中的一种计算方法&#xff0c;它通过对所有可能路径的贡献进行积分&#xff0c;来计算粒子从一个点到另一个点的概率幅。与经典力学不同&#xff0c;经典力学中粒子沿着使作用量最小的路径运动&#xff0c;而在量子力学中&#xf…...

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…...

麒麟安全增强-kysec

DAC: 自主访问控制是linux下默认的接入控制机制,通过对资源读、写、执行操作,保证系统安全 MAC:安全接入控制机制,由操作系统约束的访问控制,默认情况下,MAC不允许任何访问,用户可以自定义策略规则制定允许什么 ,从而避免很多攻击。 MAC强制访问控制常见的实现方式:…...

shell编程(8)

目录 一、until循环 示例 until 和 while 的区别 二、case语句 基本语法 示例 1. 简单的 case 语句 2. 使用通配符 3. 处理多个匹配 case 和 if 的比较 case 语句&#xff1a; if 语句&#xff1a; 三、基本函数 基本函数定义和调用 1. 定义一个简单的函数 2. …...

高级java每日一道面试题-2024年11月24日-JVM篇-说说对象分配规则?

如果有遗漏,评论区告诉我进行补充 面试官: 说说对象分配规则? 我回答: 在Java高级面试中&#xff0c;对象分配规则是一个核心考点&#xff0c;它涉及到JVM的内存管理、对象的创建和初始化等多个方面。以下是对Java对象分配规则的详细解释&#xff1a; 一、内存分配区域 J…...

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…...

性能测试及调优

一、性能测试介绍 1、什么叫做性能测试&#xff1f; &#xff08;1&#xff09;通过某些工具或手段来检测软件的某些指标是否达到了要求&#xff0c;这就是性能测试 &#xff08;2&#xff09;指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…...

实战基于LangChain和ChatGLM私有化部署聊天机器人

本文主要阐述了如何使用第二代6B模型进行对话训练&#xff0c;以及如何通过微调来提高大模型的性能。文中提到了在8501端口上启动第二代6B模型&#xff0c;并使用极简模板进行请求。与第一代模型相比&#xff0c;第二代6B模型具有更强的对话能力&#xff0c;并且可以通过微调来…...

利用adb工具安装卸载安卓平板(手机)软件

参考链接&#xff1a; 1、ADB 操作命令详解及用法大全 2、全面掌握Android调试工具箱&#xff1a;ADB与实用程序实战 平时使用小米手机没有感觉&#xff0c;miui系统做的确实好。最近买了个水货学习系统平板&#xff08;主要看重硬件配置&#xff0c;性价比很高&#xff0c;但…...

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…...

Datatables:监听行内文本框,进行行内数据修改;计算行总和

一、监听行内文本框&#xff0c;进行行内数据修改 效果 修改数量、单价会自动计算金额&#xff08;金额数量*单价&#xff09; 实现 1、增加行的class 2、数据监听、修改数值 "initComplete": function() {// 监听数量和单价输入框的变化$(document).on(input, .…...

对于某些原型或UI软件的个人看法(2024/11)

由于我这几天&#xff0c;一边敲代码&#xff0c;一边进行页面布局设计与编码&#xff0c;发现可能就一个卡片&#xff0c;我都得调很久样式&#xff0c;觉得这样改很累也没效率&#xff0c;页面也不是很美观。所以我想到了ui设计&#xff0c;我可以先进行ui设计&#xff0c;然…...

嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析

引言&#xff1a;设计一款高速板&#xff0c;供读者学习&#xff0c;FPGA核心板&#xff0c;带一颗DDR3内存&#xff0c;FPGA型号&#xff1a;XC6SLX16-2FTG256C。 随着嵌入式硬件技术的快速发展&#xff0c;高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要…...

亚信安全携手飞书“走近先进” 与保隆科技探索制造业数字化转型

亚信安全携手飞书组织举办“走近先进”活动。近日活动“走近”了中国汽车供应链百强、上海市制造业五十强企业——上海保隆汽车科技股份有限公司&#xff08;以下简称“保隆科技”&#xff09;。活动围绕“突破桎梏 加速升级”的主题&#xff0c;聚焦企业数字化转型的核心议题&…...

【C++篇】排队的艺术:用生活场景讲解优先级队列的实现

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…...

VTK的基本概念(一)

文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中&#xff0c;可以有多个灯光的存在&#xff0c;灯光和相机是三维渲染场景的必备要素&#xff0c;如果没有指定的话&#xff0c;vtkRenderer会自动创建默认的灯光和相机。…...

error LNK2001: 无法解析的外部符号 memcpy strcmp strlen

0>LIBMY_static.lib(pixdesc.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_static.lib(random_seed.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>postprocess.obj : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_sta…...

打造智能扩容新纪元:Kubernetes Custom Metrics深度解析

自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…...

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…...

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结&#xff01;&#xff01;&#xff01; 本章节优化了UI中物品描述的显示效果&#xff0c;技能描述的显示效果 并且可以批…...

c++(入门)

1. 引用 引用的定义 引用是另一个变量的别名&#xff0c;它在声明时必须被初始化&#xff0c;并且一旦初始化后&#xff0c;它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...