Spring Boot3批式訪問Dify聊天助手接口

Spring Boot3批式訪問Dify聊天助手接口

前言

之前已經配置好Dify1.4.1及LM Studio集成:

https://lizhiyong.blog.csdn.net/article/details/148607462

現在就可以借助Spring Boot3去訪問Dify的后端接口,讓前端展示大模型的返回內容。這是我等大數據資深學徒工們久經驗證,在實際生產環境的正確使用方法,較直接調用大模型接口,使用聊天助手、工作流等方式做一層中間件包裝后更安全、可控,可觀測性也很好便于大數據平臺開發攻城獅們查找到不良租戶。

Dify聊天助手配置

為了防止超時,筆者配置的是DeepSeek14b小模型:

在這里插入圖片描述

配置聊天助手時需要開啟Think模式:

在這里插入圖片描述

此時驗證下:

在這里插入圖片描述

可以正確調用LLM了!!!更新、發布、生成Token素質三聯!!!

Dify接口文檔

訪問API即可看到接口文檔,主要內容:

接口地址:

http://localhost/v1Authorization: Bearer {API_KEY}

批式訪問的請求報文:

curl -X POST 'http://localhost/v1/chat-messages' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"inputs": {},"query": "What are the specs of the iPhone 13 Pro Max?","response_mode": "streaming","conversation_id": "","user": "abc-123","files": [{"type": "image","transfer_method": "remote_url","url": "https://cloud.dify.ai/logo/logo-site.png"}]
}'

批式訪問的響應報文:

{"event": "message","task_id": "c3800678-a077-43df-a102-53f23ed20b88", "id": "9da23599-e713-473b-982c-4328d4f5c78a","message_id": "9da23599-e713-473b-982c-4328d4f5c78a","conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2","mode": "chat","answer": "iPhone 13 Pro Max specs are listed here:...","metadata": {"usage": {"prompt_tokens": 1033,"prompt_unit_price": "0.001","prompt_price_unit": "0.001","prompt_price": "0.0010330","completion_tokens": 128,"completion_unit_price": "0.002","completion_price_unit": "0.001","completion_price": "0.0002560","total_tokens": 1161,"total_price": "0.0012890","currency": "USD","latency": 0.7682376249867957},"retriever_resources": [{"position": 1,"dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb","dataset_name": "iPhone","document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00","document_name": "iPhone List","segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a","score": 0.98457545,"content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]},"created_at": 1705407629
}

就是常規的Post+Json模式!!!

Spring Boot3編碼實現

依賴

簡單配置一些依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhiyong</groupId><artifactId>spring.study</artifactId><version>0.0.1-SNAPSHOT</version><name>spring.study</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.test.skip>true</maven.test.skip><fastjson.version>1.2.83</fastjson.version><log4j2.version>2.20.0</log4j2.version><disruptor.version>3.4.2</disruptor.version><mybatis-plus.version>3.5.12</mybatis-plus.version><druid.version>1.2.23</druid.version><mysql-connector.version>8.0.33</mysql-connector.version><hutool.version>5.8.11</hutool.version><mapstruct.version>1.5.5.Final</mapstruct.version><xxl.job.version>2.4.0</xxl.job.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.4</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path><path><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

配置文件

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverdruid:url: jdbc:mysql://127.0.0.1:3306/library_1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: rootpassword: 123456initial-size: 5min-idle: 15max-active: 30remove-abandoned-timeout: 180max-wait: 300000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000max-evictable-idle-time-millis: 900000stat-view-servlet:enabled: trueloginUsername: adminloginPassword: 123456allow:web-stat-filter:enabled: truesession-stat-enable: truesession-stat-max-count: 1000url-pattern: /*filters: stat,wall,slf4jfilter:stat:enabled: truedb-type: mysqllog-slow-sql: trueslow-sql-millis: 2000Dify:token: app-TNwXhtAMGxq3HfYPUCINeImgurl: http://localhost/v1/chat-messagesuser: CSDN@HBaseIsNotFish

Controller

package com.zhiyong.spring.study.controller;import com.zhiyong.spring.study.service.DifyLlmService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.util.Map;@RestController
@RequestMapping("/Dify")
@Slf4j
public class DifyController {@AutowiredDifyLlmService difyLlmService;@PostMapping("/get/llm/solution")public Map<String,Object> getAnswerByQueryBatch(@RequestHeader("UserId") String UserId, @RequestParam("query") String query) {log.info("入參query={}", query);Map<String,Object> result= difyLlmService.getAnswerByQueryBatch(query);
//        result.put("llmSolution", query);
//        result.put("thinkProcess", "思考中"+System.currentTimeMillis());return result;}
}

后續可以PostMan通過調用該接口驗證可行性

Service

package com.zhiyong.spring.study.service;import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.util.Map;public interface DifyLlmService {Map<String, Object> getAnswerByQueryBatch(String query);
}

用于封裝接口

Impl

package com.zhiyong.spring.study.service.Impl;import com.alibaba.fastjson.JSONObject;
import com.zhiyong.spring.study.Obj.Entity.DifyBatchReqMessage;
import com.zhiyong.spring.study.Obj.Entity.DifyBatchResMessage;
import com.zhiyong.spring.study.Obj.Entity.DifyStreamReqMessage;
import com.zhiyong.spring.study.service.DifyLlmService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@Service
@Slf4j
public class DifyLlmServiceImpl implements DifyLlmService {@Value("${Dify.token}")private String difyToken;@Value("${Dify.url}")private String difyUrl;@Value("${Dify.user}")private String difyUser;@Autowiredprivate RestTemplate restTemplate;private String getQuery(String queryInput) {return "有個問題," + queryInput + "?";}private String getReqMessageBatch(String queryInput) {String query = getQuery(queryInput);String reqMessage = "";DifyBatchReqMessage batchReqMessage = new DifyBatchReqMessage();batchReqMessage.setUser(difyUser);batchReqMessage.setQuery(query);reqMessage = JSONObject.toJSONString(batchReqMessage);return reqMessage;}@Overridepublic Map<String, Object> getAnswerByQueryBatch(String query) {String answer = "";String reqMessage = getReqMessageBatch(query);HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);httpHeaders.setBearerAuth(difyToken);HttpEntity<String> batchResMessageHttpEntity = new HttpEntity<>(reqMessage, httpHeaders);try {ResponseEntity<DifyBatchResMessage> entity = restTemplate.postForEntity(difyUrl, batchResMessageHttpEntity, DifyBatchResMessage.class);if (!entity.getStatusCode().is2xxSuccessful()) {log.error("調用Dify接口失敗{}", entity.getStatusCode().value());}answer = entity.getBody().getAnswer();log.info("answer={}", answer);} catch (Exception e) {log.error("調用Dify接口出現異常,{}", e.getMessage());}Map<String, Object> result = new HashMap<>();String[] split = answer.split("</think>");String[] split1 = split[0].split("<think>");log.info("llmSolution,{}", split[1]);log.info("thinkProcess,{}", split1);result.put("llmSolution", split[1]);result.put("thinkProcess", split1);return result;}
}

Entity

package com.zhiyong.spring.study.Obj.Entity;import lombok.Data;import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;@Data
public class DifyBatchReqMessage {Map<String, Object> inputs = new HashMap<>();String query = "";String mode = "chat";String conversation_id = "";String user = "";List<Map<String, String>> files = new LinkedList<>();
}

批式請求的實體主要是這種格式

package com.zhiyong.spring.study.Obj.Entity;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class DifyBatchResMessage {String event = "";String task_id = "";String id = "";String message_id = "";String conversation_id = "";String mode = "";String answer = "";Map<String, Object> metadata = new HashMap<>();String created_at = "";
}

批式請求的響應實體主要是這種格式

接口驗證

http://127.0.0.1:9999/Dify/get/llm/solution

在這里插入圖片描述

填寫必要的請求頭和請求參數后,接口在90s以后返回了內容:

{"llmSolution": "虎鯨是魚嗎?\n\n**結論:虎鯨不是魚,而是哺乳動物。**\n\n解釋:\n\n1. **分類基礎**:\n   - 魚類和哺乳動物都屬于脊椎動物,但它們有不同的特征。\n\n2. **魚類的特征**:\n   - 用鰓呼吸。\n   - 大多為卵生或卵胎生。\n\n3. **哺乳動物的特征**:\n   - 用肺呼吸。\n   - 胎生,通過哺乳喂養幼崽。\n\n4. **虎鯨的分類**:\n   - 屬于鯨魚,是哺乳動物。\n   - 盡管生活在海洋中,但它們符合哺乳動物的定義,因此不是魚類。\n\n總結:虎鯨雖然是水生生物,但屬于哺乳動物,而不是魚。","thinkProcess": ["","\n嗯,今天老師布置了一個問題,問虎鯨是不是魚。這個問題聽起來簡單,但我覺得可能有些同學會有一些不同的看法。讓我仔細想想。\n\n首先,我知道虎鯨是一種海洋生物,它生活在海里,應該和魚一樣在水里游動。那它們到底是不是魚呢?我記得以前學過魚類的定義,可能有幫助。魚類通常有什么特征呢?\n\n我記得魚是脊椎動物,有鰓,沒有皮膚覆蓋全身,身體兩側有一對鰭。比如,鯉魚、鯊魚這些都是魚。那么虎鯨呢?它屬于鯨魚,鯨魚是不是和魚一樣?\n\n然后,我想到鯨魚其實不是魚,而是哺乳動物。它們在哺乳動物的分類里,對吧?那為什么它們被稱為鯨魚,而沒有叫鯨獸或者其他什么名字?\n\n再想想,鯨魚的特點。它們是生活在海洋中的哺乳動物,用肺呼吸,生 baby是通過胎生的,對嗎?比如,虎鯨就是其中一種鯨魚,所以它應該屬于哺乳動物,而不是魚。\n\n那為什么有時候人們會說鯨魚呢?可能是因為它們在水里生活,和魚一樣,但其實分類上它們有不同的特征。所以,雖然虎鯨生活在海里,但它還是哺乳動物,不是魚。\n\n總結一下,魚類和哺乳動物都是脊椎動物,但哺乳動物有胎生、用肺呼吸等特征,而魚類則用鰓呼吸,卵生或卵胎生。因此,虎鯨作為鯨魚,屬于哺乳動物,所以它不是魚。\n"]
}

至此,獲取到后端返回的內容來展示就是前端攻城獅的事情啦!!!

Dify后臺觀測

在這里插入圖片描述

可以看到耗時93s花銷了498個Token!!!

在這里插入圖片描述

7840HS的780M核顯跑14b小模型能到11個Token/s還不錯!!!

轉載請注明出處:https://lizhiyong.blog.csdn.net/article/details/148607578

在這里插入圖片描述

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

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

相關文章

事務傳播行為詳解

一、事務傳播行為的基本概念 事務傳播行為是Spring 框架中事務管理的核心概念&#xff0c;用于定義當一個事務方法被另一個事務方法調用時&#xff0c;事務應如何傳播。通俗地說&#xff0c;它解決了 “多個事務方法嵌套調用時&#xff0c;新方法是加入現有事務還是創建新事務…

Java八股文——Spring「SpringMVC 篇」

MVC分層介紹一下 面試官您好&#xff0c;MVC是一種非常經典、影響深遠的軟件設計模式&#xff0c;它的全稱是Model-View-Controller。在我看來&#xff0c;它的核心目標就是解決早期Web開發中&#xff0c;業務邏輯、數據和界面顯示高度耦合的問題&#xff0c;從而實現“各司其…

FreeSWITCH mod_curl 和 mod_xml_rpc 測試

編輯 /usr/local/freeswitch/conf/autoload_configs/xml_rpc.conf.xml <configuration name"xml_rpc.conf" description"XML RPC"> <settings> <param name"http-port" value"8889"/> <param name&quo…

實時監控、秒級決策:鏡舟科技如何重塑融資融券業務數據處理模式

融資融券業務作為證券市場的重要組成部分&#xff0c;已成為金融機構核心業務增長點和利潤來源。截至 2023 年底&#xff0c;我國融資融券余額已突破 1.8 萬億元&#xff0c;業務量呈現爆發式增長。然而&#xff0c;在業務高速發展的同時&#xff0c;金融機構面臨著數據處理效率…

Linux與量子計算:面向未來的架構演進

Linux與量子計算&#xff1a;面向未來的架構演進 當經典計算遇上量子革命 引言&#xff1a;量子計算時代的黎明 量子計算正從理論走向工程實踐&#xff0c;Linux作為現代計算的基石&#xff0c;正在量子革命中扮演關鍵角色。據IBM預測&#xff0c;到2027年&#xff0c;量子優勢…

Java中wait()為何必須同步調用?

在 Java 中&#xff0c;wait() 方法必須在 synchronized 方法或代碼塊中調用&#xff0c;主要原因如下&#xff1a; 1. 監視器鎖&#xff08;Monitor&#xff09;機制 依賴對象鎖&#xff1a;wait() 方法需要操作對象的監視器鎖&#xff08;Monitor&#xff09;&#xff0c;調…

前端面試專欄-基礎篇:4. 頁面渲染流程與性能優化

頁面渲染流程與性能優化詳解&#xff08;完整版&#xff09; 一、現代瀏覽器渲染流程&#xff08;詳細說明&#xff09; 1. 構建DOM樹 瀏覽器接收到HTML文檔后&#xff0c;會逐步解析并構建DOM&#xff08;Document Object Model&#xff09;樹。具體過程如下&#xff1a; (…

漲薪技術|Docker端口映射與容器互聯技術

前面的推文我們學了Docker操作的常用命令,今天開始給大家分享Docker端口映射與容器互聯,歡迎關注。Docker不管是程序員,架構師或者測試工程師都必須要掌握的一門主流技術。 Docker除了通過網絡訪問外,還提供了兩個很方便的功能來滿足服務訪問的基本需求,一個是允許映射容…

Roboguide工作站機器人重新安裝軟件包

1、點擊菜單欄“機器人-屬性”&#xff1b; 2、點擊“重新生成”&#xff1b; 3、點擊“確定”&#xff1b; 4、點擊“6&#xff1a;機器人選項” 5、在搜索框搜索軟件包&#xff0c;或在軟件包列表選擇&#xff0c;勾選軟件包后點擊“下一步”&#xff1b; 6、點擊“完成”&am…

預訓練CNN網絡的遷移學習(MATLAB例)

從基于大型數據集訓練的神經網絡中提取層&#xff0c;并基于新數據集進行微調。本例使用ImageNet中的子集進行微調。 This example retrains a SqueezeNet neural network using transfer learning. This network has been trained on over a million images, and can classif…

kali系統 windows Linux靶機入侵演練

Kali系統與Windows/Linux靶機入侵演練簡介 演練概述 Kali Linux是一款專為滲透測試和網絡安全評估設計的操作系統,常被安全專業人員用于合法的安全測試。入侵演練是網絡安全訓練的重要組成部分,旨在幫助安全人員了解攻擊手法并提升防御能力。 基本組件 1. **攻擊機**:通常…

手搓transformer

思路是這樣子的&#xff1a;從手搓代碼的角度去學習transformer&#xff0c;代碼會一個一個模塊地從頭到尾添加&#xff0c;以便學習者跟著敲&#xff0c;到最后再手搓一個基于tansformer的機器翻譯實戰項目。 transformer整體架構 一、輸入部分 詞向量 import torch import t…

網絡層協議:IP

目錄 1、概念 2、關鍵組成部分 2.1 IP地址 2.1.1 概念 2.1.2 主要版本 2.1.3 IP地址分類 2.2 IP數據報&#xff08;IP協議傳輸的基本數據單元&#xff09; 3、工作原理 3.1 路由 3.2 分片與重組 4、相關協議 1、概念 目的&#xff1a;負責在復雜的網絡環境中將數據…

Fastadmin報錯Unknown column ‘xxx.deletetime‘ in ‘where clause

報錯原因 在開啟軟刪除后&#xff0c;設置了表別名&#xff0c;軟刪除字段依舊使用原表名。 解決方法 原代碼 $list $this->model->with([admin, product])->where($where)->order($sort, $order)->paginate($limit);foreach ($list as $row) {$row->ge…

TCN+Transformer+SE注意力機制多分類模型 + SHAP特征重要性分析,pytorch框架

效果一覽 TCNTransformerSE注意力機制多分類模型 SHAP特征重要性分析 TCN&#xff08;時序卷積網絡&#xff09;的原理與應用 1. 核心機制 因果卷積&#xff1a;確保時刻 t t t 的輸出僅依賴 t ? 1 t-1 t?1 及之前的數據&#xff0c;避免未來信息泄露&#xff0c;嚴格保…

Elasticsearch的數據同步

elasticsearch中的數據多是來自數據庫&#xff0c;當數據庫發生改變時&#xff0c;elasticsearch也必須跟著改變&#xff0c;這個就叫做數據同步。 當我們是進行微服務的時候&#xff0c;同時兩個服務不能進行相互調用的時候。就會需要進行數據同步。 方法一&#xff1a;同步…

uniapp 時鐘

<template><view class"clock-view"><view class"clock-container u-m-b-66"><!-- 表盤背景 --><view class"clock-face"></view><!-- 時針 --><view class"hand hour-hand" :style&quo…

【大模型】實踐之1:macOS一鍵部署本地大模型

Ollama + Open WebUI 自動部署腳本解析說明文檔 先看下效果 一、腳本內容 #!/bin/bash set -eMODEL_NAME="qwen:1.8b" LOG_FILE="ollama_run.log" WEBUI_PORT=3000 WEBUI_CONTAINER_PORT=8080 WEBUI_URL="http://localhost:$WEBUI_PORT" DOC…

相機Camera日志實例分析之三:相機Camx【視頻光斑人像錄制】單幀流程日志詳解

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; 這一篇我們開始講&#xff1a; 目錄 一、場景操作步驟 二、日志基礎關鍵字分級如下 三、場景日志如下&#xff1a; 一、場景操作步驟 操作步…

介紹一下 TCP方式程序的通訊,服務器機與客戶機

TCP通信方式&#xff1a;服務器與客戶機通信詳解 TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。下面我將詳細介紹TCP方式下服務器與客戶機的通信過程。 基本概念 TCP特點&#xff1a; 面向連接&#xff1a;通信前需建立連接可靠傳輸&#xff1a;…