SpringBoot_websocket實戰

SpringBoot_websocket實戰

  • 前言
  • 1.websocket入門
    • 1.1 websocket最小化配置
      • 1.1.1 后端配置
      • 1.1.2 前端配置
    • 1.2 websocket使用sockjs
      • 1.2.1 后端配置
      • 1.2.2 前端配置
    • 1.3 websocket使用stomp協議
      • 1.3.1 后端配置
      • 1.3.2 前端配置
  • 2.websocket進階
    • 2.1 websocket與stomp有什么區別
    • 2.2 websocket與stomp怎么選
  • 3.websocket實戰
    • 3.1 案例1:websocket 實現web-ssh
    • 3.2 案例2:websocket 實現控制臺日志在線展示

前言

本文記錄說明springboot websocket示例及實戰,你將學習到
三種websocket開發方式

  • /websocket 接口演示原生websocket前后端收發websocket消息
  • /websocket-sockjs 演示使用sockjs 前后端收發websocket消息
  • /weboscket-stomp 演示使用stomp協議使用websocket

以及通過實戰演示在不同業務場景的技術選擇

  • web-ssh 使用sockjs點對點數據傳輸
  • 日志項目 使用stomp廣播數據

使用環境:

  • springboot: 2.3.2.RELEASE
  • jdk: java11

1.websocket入門

Spring Boot WebSocket是Spring框架的一部分,用于實現WebSocket通信協議的支持。WebSocket是一種雙向通信協議,允許服務器與客戶端之間進行實時、低延遲的數據交換,適用于實時聊天、實時通知、在線協作和實時數據展示等場景。Spring Boot WebSocket提供了使用WebSocket的簡化和高效的方法,讓開發者能夠輕松地實現WebSocket通信。

以下是Spring Boot WebSocket的主要特點和概念:

  1. WebSocket協議支持: Spring Boot WebSocket支持WebSocket通信協議,允許雙向的、實時的通信。WebSocket允許服務器主動向客戶端推送數據,而不需要客戶端發起請求。
  2. STOMP協議支持: 除了原始WebSocket,Spring Boot WebSocket還支持STOMP(Simple Text Oriented Messaging Protocol)協議。STOMP是一個基于文本的協議,它提供了更高級的消息傳遞功能,例如消息訂閱、目標廣播和認證等。
  3. 消息處理器: Spring Boot WebSocket允許你定義消息處理器,用于處理WebSocket消息。你可以編寫處理器來處理接收到的消息,并決定如何響應。
  4. 消息代理: Spring Boot WebSocket支持消息代理,你可以配置一個消息代理服務器(如RabbitMQ或ActiveMQ),用于處理WebSocket消息的分發和廣播。這使得構建分布式和擴展的WebSocket應用程序更容易。
  5. 消息廣播: Spring Boot WebSocket允許你將消息廣播到多個訂閱者。這對于實現群聊、廣播通知和實時數據展示等功能非常有用。
  6. 安全性: Spring Boot WebSocket提供了與Spring Security集成的方式,可以輕松實現WebSocket連接的安全性和認證。
  7. SockJS支持: Spring Boot WebSocket還支持SockJS,這是一個JavaScript庫,用于處理瀏覽器不支持WebSocket的情況下的降級處理,使得WebSocket通信在各種瀏覽器上都能正常工作

1.1 websocket最小化配置

步驟說明

  • 后端通過@EnableWebSocket注解開啟websocket功能
    1. 定義websocket的訪問端點 (作用: 定義對外暴露websocket接口)
    2. 定義websocket的處理器 (作用: 解決websocket建立后消息怎么處理)
  • 前端通過new WebSocket(“ws://localhost:9090/websocket”); 打開websocket連接并監聽消息

1.1.1 后端配置

  • maven 依賴
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
  • WebSocketConfiguration 實現WebSocketConfigurer注冊websocket接口及處理器
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {@Autowiredprivate EchoWebSocketHandler echoWebSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 配置原生WebSocket處理器registry.addHandler(echoWebSocketHandler, "/websocket").setAllowedOrigins("*"); //允許跨域}@Beanpublic EchoWebSocketHandler echoWebSocketHandler() {return new EchoWebSocketHandler();}
}
  • EchoWebSocketHandler 實現WebSocketHandler接口, 接受消息后簡單打印轉發消息
public class EchoWebSocketHandler implements WebSocketHandler {private static final Logger LOGGER = LoggerFactory.getLogger(EchoWebSocketHandler.class);@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {// 連接建立時的處理邏輯LOGGER.info("[websocket-echo] session:{} ConnectionEstablished", session.getId());}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws IOException {String payload = (String) message.getPayload();LOGGER.info("[websocket-echo] session:{} receive:{}", session.getId(), payload);session.sendMessage(new TextMessage(payload));}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {// 處理傳輸錯誤}// 連接關閉時的處理邏輯@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {LOGGER.info("[websocket-echo] WebSocketSession[{}] close all ssh connection", session.getId());}@Overridepublic boolean supportsPartialMessages() {return false;}
}

1.1.2 前端配置

TODO 說明下WebSocket 對象作用

<!DOCTYPE html>
<html>
<head><title>原始WebSocket示例</title>
</head>
<body>
<h1>測試默認websocket 接發消息</h1>
<div id="messages"></div>
<input type="text" id="message" placeholder="輸入消息">
<button onclick="sendMessage()">發送</button><script>var socket = new WebSocket("ws://localhost:9090/websocket");socket.onopen = function(event) {console.log("WebSocket連接已打開");};socket.onmessage = function(event) {var messages = document.getElementById("messages");messages.innerHTML += "<p>" + event.data + "</p>";};function sendMessage() {var messageInput = document.getElementById("message");var message = messageInput.value;socket.send(message);messageInput.value = "";}
</script>
</body>
</html>

1.2 websocket使用sockjs

為了區別原生WebSocket處理器,以示區別,再注冊一個接口/websocket-sockjs. 并且開啟.withSockJS()

1.2.1 后端配置

@Configuration
@EnableWebSocket
@Import({WebSocketStompConfiguration.class})
public class WebSocketConfiguration implements WebSocketConfigurer {@Autowiredprivate EchoWebSocketHandler echoWebSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 配置原生WebSocket處理器器registry.addHandler(echoWebSocketHandler, "/websocket").setAllowedOrigins("*");//WebSocket connection to 'ws://localhost:9090/websocket' failed: Error during WebSocket handshake: Unexpected response code: 200//.withSockJS();//.withSockJS()的作用是聲明我們想要使用 SockJS 功能,如果WebSocket不可用的話,會使用 SockJS。(前端需要使用sockjs庫)registry.addHandler(echoWebSocketHandler, "/websocket-sockjs").setAllowedOrigins("*").withSockJS();}@Beanpublic EchoWebSocketHandler echoWebSocketHandler() {return new EchoWebSocketHandler();}
}

1.2.2 前端配置

使用sockjs需要引入前端sockjs的庫: https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js

<!DOCTYPE html>
<html>
<head><title>原始WebSocket示例</title><script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
</head>
<body>
<h1>測試websocket sockjs接發消息</h1>
<div id="messages"></div>
<input type="text" id="message" placeholder="輸入消息">
<button onclick="sendMessage()">發送</button><script>// var socket = new WebSocket("ws://localhost:9090/websocket");//原始寫法var socket = new SockJS('http://localhost:9090/websocket-sockjs');// 依賴sockjs庫socket.onopen = function(event) {console.log("WebSocket連接已打開");};// 監聽websockt消息回調socket.onmessage = function(event) {var messages = document.getElementById("messages");messages.innerHTML += "<p>" + event.data + "</p>";};// 定義連接關閉時的回調函數socket.onclose = function () {console.log('WebSocket 連接已關閉');};// 定義連接錯誤時的回調函數socket.onerror = function (e) {console.error('WebSocket 連接出錯:', e);};function sendMessage() {var messageInput = document.getElementById("message");var message = messageInput.value;socket.send(message);messageInput.value = "";}
</script>
</body>
</html>

1.3 websocket使用stomp協議

步驟說明

  • 啟用stomp協議, 通過@EnableWebSocketMessageBroker 并注冊stomp的端點
    1. 定義stomp端點 WebSocketStompConfiguration
    2. 配置stomp消息路由 TestWebSocketStompController

1.3.1 后端配置

@EnableWebSocketMessageBroker //在 WebSocket 上啟用 STOMP
public class WebSocketStompConfiguration {@Bean@ConditionalOnMissingBeanpublic WebSocketMessageBrokerConfigurer brokerConfigurer() {return new WebSocketMessageBrokerConfigurer() {/*** stomp 協議,一種格式比較簡單且被廣泛支持的通信協議,spring4提供了以stomp協議為基礎的websocket通信實現。* spring 的websocket實現,實際上是一個簡易版的消息隊列(而且是主題-訂閱模式的)* @param registry*/@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// "/stomp-websocket",客戶端需要注冊這個端點進行鏈接,// .withSockJS()的作用是聲明我們想要使用 SockJS 功能,如果WebSocket不可用的話,會使用 SockJS。registry.addEndpoint("/websocket-stomp").setAllowedOrigins("*").withSockJS();}};}}
  • 配置消息轉發路由
@Controller
public class TestWebSocketStompController {private static final Logger LOGGER = LoggerFactory.getLogger(TestWebSocketStompController.class);@AutowiredSimpMessagingTemplate messagingTemplate;@GetMapping("/websocket/print/{msg}")@ResponseBodypublic String print(@PathVariable String msg) {messagingTemplate.convertAndSend("/topic/print", msg);return msg;}@MessageMapping("/app/{destination}") // 使用 {destination} 占位符來捕獲動態的目的地@SendTo("/topic/print") // 服務器廣播消息的目的地public String handleMessage(@DestinationVariable String destination, String message) {// 處理接收到的消息LOGGER.info("Dynamic destination:[{}] Received message:{}", destination, message);// 根據動態目的地執行不同的操作if ("destination1".equals(destination)) {// 處理目的地1的操作} else if ("destination2".equals(destination)) {// 處理目的地2的操作} else {// 直接轉發到對應訂閱地址messagingTemplate.convertAndSend("/topic/" + destination, "copy:" + message);}// 可以根據需要添加更多的條件// 返回響應消息return message;}
}
  • 最后通過@Import導入WebSocketStompConfiguration配置
@Configuration
@EnableWebSocket
@Import({WebSocketStompConfiguration.class})
public class WebSocketConfiguration implements WebSocketConfigurer {@Autowiredprivate EchoWebSocketHandler echoWebSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 配置原生WebSocket處理器registry.addHandler(echoWebSocketHandler, "/websocket").setAllowedOrigins("*");//WebSocket connection to 'ws://localhost:9090/websocket' failed: Error during WebSocket handshake: Unexpected response code: 200//.withSockJS();//.withSockJS()的作用是聲明我們想要使用 SockJS 功能,如果WebSocket不可用的話,會使用 SockJS。(前端需要使用sockjs庫)registry.addHandler(echoWebSocketHandler, "/websocket-sockjs").setAllowedOrigins("*").withSockJS();}@Beanpublic EchoWebSocketHandler echoWebSocketHandler() {return new EchoWebSocketHandler();}
}

1.3.2 前端配置

前端依賴sockjs及stomp.min.js的庫

<!DOCTYPE html>
<html>
<head><title>WebSocket Example</title><script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.2/sockjs.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script></head>
<body>
<h1>測試websocket stomp協議接發消息</h1>
<h2>發送示例</h2>
<input type="text" id="sendDestination" placeholder="Enter send destination"><input type="text" id="message" placeholder="Enter your message">
<button onclick="sendMessage()">Send Message</button><hr>
<h2>訂閱示例</h2>
<input type="text" id="listenDestination" placeholder="Enter listen destination">
<button onclick="subscribeToDestination()">Subscribe</button>
<div id="messages"></div><script>var stompClient = null;var listenDestination = null;function connect() {var socket = new SockJS('/websocket-stomp'); // WebSocket端點stompClient = Stomp.over(socket);stompClient.connect({}, function (frame) {console.log('stomp Connected: ' + frame);});}function sendMessage() {var sendDestination = document.getElementById('sendDestination').value; // 獲取發送目的地var message = document.getElementById('message').value;stompClient.send('/app/' + sendDestination, {}, message); // 發送消息到指定的目的地}function subscribeToDestination() {listenDestination = document.getElementById('listenDestination').value; // 獲取監聽目的地stompClient.subscribe('/topic/' + listenDestination, function (message) {displayMessage(message.body);});}function displayMessage(message) {var messagesDiv = document.getElementById('messages');var p = document.createElement('p');p.appendChild(document.createTextNode(message));messagesDiv.appendChild(p);}connect();
</script>
</body>
</html>

2.websocket進階

2.1 websocket與stomp有什么區別

  • WebSocket
    1. WebSocket 是一種通信協議: WebSocket 是一種在Web瀏覽器和服務器之間提供雙向通信的協議。它允許在客戶端和服務器之間創建持久性的連接,以便在連接建立后實時地發送和接收消息。
    2. 原始的、低級的協議: WebSocket 是一種相對較低級的協議,它允許在兩端之間直接發送原始的消息幀(frames)。這意味著你可以通過WebSocket發送任意的二進制或文本數據。
    3. 需要自行處理消息格式和路由邏輯: WebSocket 本身并沒有規定消息的格式或路由邏輯。在WebSocket上發送的消息可以是任意格式的數據,你需要自行定義消息的結構和處理邏輯。
  • STOMP
    1. STOMP 是一種消息協議: STOMP 是一種基于文本的簡單消息協議,它定義了客戶端和消息代理(broker)之間如何進行交互的規范。STOMP 通常運行在WebSocket之上,它提供了一種在客戶端和服務器之間進行實時消息通信的方式。
    2. 面向文本的消息格式: STOMP 消息是文本格式的,它使用類似于HTTP報文的格式來定義消息的頭部和體。這種面向文本的格式使得它易于閱讀和調試。
    3. 定義了消息的結構和路由邏輯: STOMP 規定了消息的格式和消息目的地的語義。它定義了消息頭部的各種屬性(例如,目的地、消息類型等),并提供了一種簡單的消息路由機制,使得消息能夠被發送到特定的目的地。

2.2 websocket與stomp怎么選

如果你期望WebSocket連接之間是隔離的,不需要共享數據,那么使用原始的WebSocket通信是一個合適的選擇。原始WebSocket通信提供了一種簡單而輕量級的方式,每個連接都是獨立的,不會共享會話數據。

STOMP協議通常用于需要高級消息傳遞功能和消息廣播的場景,其中不同連接之間需要共享數據。如果你不需要這種復雜性,原始WebSocket通信足以滿足需求,而且更容易理解和維護。

因此,你可以根據你的應用程序需求選擇使用原始WebSocket通信或STOMP協議。如果只需要簡單的雙向通信并希望保持連接之間的隔離,原始WebSocket通信通常是一個更直接的選擇

3.websocket實戰

3.1 案例1:websocket 實現web-ssh

springboot實現webssh功能, 使用xterm(前端) + websocket + jsch技術實現。后端主要實現websocket消息與jsch命令收發即可。還在開發中, 篇幅關系,實現過程就不寫了。有需要點贊或留言,開源后再通知。

在這里插入圖片描述

3.2 案例2:websocket 實現控制臺日志在線展示

web在線查看springboot后臺日志,源碼參考:https://github.com/easycode8/easy-log 的easy-log-web模塊, 代碼量很少。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

思維模型 重疊效應

本系列文章 主要是 分享 思維模型 &#xff0c;涉及各個領域&#xff0c;重在提升認知。相似內容易被混淆或遺忘。 1 重疊效應的應用 1.1 重疊效應在教育中的應用 1 通過避免重疊效應提升學習效率 為了避免重疊效應&#xff0c;通過對比、歸納等方法來幫助學生更好地理解和掌…

黑馬React18: Redux

黑馬React: Redux Date: November 19, 2023 Sum: Redux基礎、Redux工具、調試、美團案例 Redux介紹 Redux 是React最常用的集中狀態管理工具&#xff0c;類似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以獨立于框架運行 作用&#xff1a;通過集中管理的方式管…

VPS配置了swap沒發揮作用怎么辦

1 swap配置了但沒用上 我的服務器內存是2G&#xff0c;裝多一點東西就不夠用&#xff0c;于是我給他分配了2G的swap&#xff0c;等了幾小時&#xff0c;swap還是一點都沒有使用 Linux中Swap&#xff08;即&#xff1a;交換分區&#xff09;&#xff0c;類似于Windows的虛擬內存…

MongoDB的常用操作以及python連接MongoDB

一,MongoDB的啟動 mongod --dbpath..\data\db mongodb注意同時開兩個窗口&#xff0c;不要關&#xff01; 二, MongoDB的簡單使用 簡單介紹一下mongoDB中一些操作 show dbs: 顯示所有數據庫 show databases: 顯示所有數據庫 use xxxx: 使用指定數據庫/創建數據庫&#xff08…

Linux 與大型機 z/OS

大型機 國際商業機器公司&#xff08;International Business Machine Corporation&#xff09;&#xff0c;簡稱為 IBM&#xff0c;實際上是當今大型機的代名詞。作為大型企業技術解決方案提供商&#xff0c;IBM 在其漫長的生命周期中生產了各種產品。 他們的前身是計算、制表…

時序預測 | MATLAB實現基于BiLSTM-AdaBoost雙向長短期記憶網絡結合AdaBoost時間序列預測

時序預測 | MATLAB實現基于BiLSTM-AdaBoost雙向長短期記憶網絡結合AdaBoost時間序列預測 目錄 時序預測 | MATLAB實現基于BiLSTM-AdaBoost雙向長短期記憶網絡結合AdaBoost時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 1.Matlab實現BiLSTM-Adaboost…

【精選】Ajax技術知識點合集

Ajax技術詳解 Ajax簡介 Ajax 即“Asynchronous Javascript And XML”&#xff08;異步 JavaScript 和 XML&#xff09;&#xff0c;是指一種創建 交互式、快速動態應用的網頁開發技術&#xff0c;無需重新加載整個網頁的情況下&#xff0c;能夠更新頁面局 部數據的技術。通過在…

Scala如何寫一個通用的游戲數據爬蟲程序

以前想要獲取一些網站數據的時候&#xff0c;都是通過人工手動復制粘貼&#xff0c;這樣的效率及其低下。數據少無所謂&#xff0c;如果需要采集大量數據&#xff0c;手動就顯得乏力了。半夜睡不著&#xff0c;爬起來寫一段有關游戲商品數據的爬蟲通用模板&#xff0c;希望能幫…

專業pdf編輯工具PDF Expert mac中文版特點介紹

PDF Expert mac是一款專業的PDF編輯和閱讀工具。它可以幫助用戶在Mac、iPad和iPhone等設備上查看、注釋、編輯、填寫和簽署PDF文檔。 PDF Expert mac軟件特點 PDF編輯&#xff1a;PDF Expert提供了豐富的PDF編輯功能&#xff0c;包括添加、刪除、移動、旋轉、縮放、裁剪等操作…

基于順序表實現通訊錄

1.功能實現 功能要求 1&#xff09;至少能夠存儲100個人的通訊信息 2&#xff09;能夠保存用戶信息&#xff1a;名字、性別、年齡、電話、地址等 3&#xff09;增加聯系人信息 4&#xff09;刪除指定聯系人 5&#xff09;查找制定聯系人 6&#xff09;修改指定聯系人 7&#xf…

Hutool HttpRequest 首次請求正常 第二次被系統攔截

Hutool HttpRequest 首次請求正常 第二次被系統攔截 功能描述異常現象錯誤代碼 異常排查問題跟蹤問題總結處理方案最終修改后的代碼 功能描述 需要請求第三方某個接口&#xff0c;獲取接口中的數據。 異常現象 使用main 方法 通過Hutool 工具類發出請求&#xff0c;獲取數據…

網絡運維與網絡安全 學習筆記2023.11.22

網絡運維與網絡安全 學習筆記 第二十三天 今日目標 VLAN間通信之交換機、VLAN間通信綜合案例、浮動路由 VRRP原理與配置、VRRP鏈路跟蹤、VRRP安全認證 VLAN間通信之交換機 單臂路由的缺陷 在內網的VLAN數量增多時&#xff0c;單臂鏈路容易成為網絡瓶頸 三層交換機 具備…

react中模塊化樣式中:global的作用

在react中如果是通過import styles from ./index.less這種方式模塊化引入樣式的話&#xff0c;那么編譯后的less文件里的樣式名都會自動添加后綴。而:global的作用就是不讓類名添加后綴

利用 Apache Ranger 管理 Amazon EMR 中的數據權限

需求背景簡介 系統安全通常包括兩個核心主題&#xff1a;身份驗證和授權。一個解決“用戶是誰”的問題&#xff0c;另一個解決“用戶允許執行什么操作”的問題。在大數據領域&#xff0c;Apache Ranger 是最受歡迎的授權選擇之一&#xff0c;它支持所有主流大數據組件&#xff…

微機原理_1

一、單項選擇題(本大題共15小題,每小題3分,共45分。在每小題給出的四個備選項中,選出一個正確的答案,請將選定的答案填涂在答題紙的相應位置上。) 1,下列8086CPU標志寄存器的標志位中,不屬于狀態標志位的是(&#xff09; A. OF B. IF C. AF D. PF 8086微處理器可尋址訪問的最大…

面試中vue-router的一些知識點

Vue Router Vue Router使用舉例說明 vue-router 中 route和router的區別與聯系 route和router的區別與聯系 vue3 路由使用vue2 路由與vue3 路由的區別與聯系 Vue Router Vue Router是Vue.js官方的路由管理器&#xff0c;用于實現單頁面應用中的路由功能。它允許我們在Vue應用程…

萬界星空科技SMT行業生產管理MES系統解決方案

一、SMT行業特點&#xff1a; SMT&#xff08;Surface Mounted Technology&#xff09;作為電子組裝行業里首先的技術和工藝&#xff0c;選擇合適的MES解決方案來保障SMT生產的成功至關重要。 電子行業涉及的范圍非常廣&#xff0c;包含了汽車、電腦、電視、手機等產品上&…

HCIA-Datacom跟官方路線學習

通過兩次更換策略。最后找到最終的學習方案&#xff0c;華為ICT官網有對這個路線的學習&#xff0c;hcia基礎有這個學習路線&#xff0c;hcip也有目錄路線。所以&#xff0c;最后制定學習路線&#xff0c;是根據這個認證的路線進行學習了&#xff1a; 官網課程&#xff1a;課程…

scala 實現表達式解析

表達式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…

everything的高效使用方法

目錄 前言1 everything的簡單介紹2 常用搜索3 語法搜索4 正則表達式搜索5 服務器功能 前言 本文介紹everything軟件的高效使用方法&#xff0c;everything是一款在系統中快速搜索文件的軟件&#xff0c;能夠幫助人們快速定位需要查找的文件。首先介紹everything軟件的作用和使…