詳解與FTP服務器相關操作

目錄

什么是FTP服務器

搭建FTP服務器相關

?編輯

Unity中與FTP相關的類

上傳文件到FTP服務器

使用FTP服務器上傳文件的關鍵點

開始上傳

從FTP服務器下載文件到客戶端

使用FTP下載文件的關鍵點

開始下載

關于FTP服務器的其他操作

將文件的上傳,下載,刪除等其他操作使用面向對象的思想用單例模式進行封裝

測試FTPMgr模塊的功能

什么是FTP服務器

  • 基本概念:FTP 是文件傳輸協議(File Transfer Protocol)的縮寫,FTP 服務器就是遵循該協議,專門用來存儲和管理文件,并為用戶提供文件上傳和下載服務的服務器。用戶可以通過 FTP 客戶端軟件連接到 FTP 服務器,進行文件的傳輸操作。
  • 功能特點
    • 文件傳輸:支持文件的上傳和下載,用戶可以將本地計算機上的文件上傳到 FTP 服務器,也可以從 FTP 服務器下載所需的文件到本地。
    • 用戶管理:可以設置不同的用戶賬戶,并為每個用戶分配不同的權限,如讀取、寫入、刪除等權限,從而實現對文件訪問的精細控制。
    • 目錄管理:允許創建、刪除、重命名目錄,以及在目錄之間移動文件等操作,方便對文件進行組織和管理。

搭建FTP服務器相關

 #region 知識點一 搭建FTP服務器的幾種方式//1.使用別人做好的FTP服務器軟件 (學習階段建議使用)//2.自己編寫FTP服務器應用程序,基于FTP的工作原理,用Socket中TCP通信來進行編程(工作后由后端程序員來做) //3.將電腦搭建為FTP文件共享服務器 (工作后由后端程序員來做)//第2,3點我們前端程序主要做了解  //一般在工作中不會由我們來完成這部分工作#endregion   #region 知識點二 使用別人做好的FTP服務器軟件來搭建FTP服務器//下載Serv-U等FTP服務器軟件   //在想要作為FTP服務器的電腦上運行之  //1.創建域 直接不停下一步即可   //2.使用單向加密  //3.創建用于上傳下載的FTP 賬號和密碼#endregion  #region 總結  //在實際商業項目開發當中,如果需要用FTP來進行文件傳輸      //那么FTP服務器的解決方案都是由后端程序員來完成的    //不管它使用哪種方式來搭建FTP服務器  //只要能正常上傳下載內容并且保證安全性即可#endregion

我們使用Serv-U服務器作為我們的FTP服務器

Unity中與FTP相關的類

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using UnityEngine;public class Lesson18 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知識點一 NetWorkCredential類//命名空間:System.Net//NetWorkCredential通信憑證類//用于在FTP文件傳輸時,設置賬號密碼NetworkCredential n = new NetworkCredential("DamnF", "DamnF123");#endregion#region 知識點二 FtpWebRequest類//命名空間:System.Net//Ftp文件傳輸協議客戶端操作類//主要用于:上傳,下載,刪除服務器上的文件//重要方法//1.Create 創建新的WebRequest,用于進行相關的Ftp相關操作FtpWebRequest req =FtpWebRequest.Create(new Uri("ftp://127.0.0.1/Test.txt"))as FtpWebRequest;//2.Abort 如果正在進行文件傳輸,用此方法可以終止文件傳輸req.Abort();//3.GetRequestStream 獲取用于上傳的流Stream s= req.GetRequestStream();//4.GetResponse 返回Ftp服務器響應//FtpWebResponse res= req.GetResponse()as FtpWebResponse;//重要成員//1.Credentials 通信憑證,設置為NetWorkCredential對象req.Credentials = n;//2.KeepAlive bool值,當完成請求時是否關閉到Ftp服務器的控制連接(默認為true,不關閉);req.KeepAlive = false;//3.Method 操作命令設置// WebRequestMethods.Ftp類中的操作命令屬性// DeleteFile  刪除文件// DownloadFile  下載文件// ListDirectory  獲取文件簡短列表// ListDirectoryDetails  獲取文件詳細列表// MakeDirectory  創建目錄// RemoveDirectory  刪除目錄// UploadFile  上傳文件req.Method = WebRequestMethods.Ftp.DownloadFile;//4.UseBinary 是否使用2進制傳輸req.UseBinary = true;//5.RenameTo  重命名req.RenameTo = "myTest.txt";#endregion#region 知識點三 FtpWebResponse類//命名空間:System.Net//它是用于封裝Ftp服務器對請求的響應//它提供操作狀態和從服務器下載數據//我們可以通過FtpWebRequest對象中的GetResponse()方法獲取//當使用完畢時,要使用Close釋放//通過它真正獲取服務器的內容FtpWebResponse res = req.GetResponse() as FtpWebResponse;//重要方法//1.Close:釋放所有資源res.Close();//2.GetResponseStream:返回從Ftp下載數據的流Stream stream= res.GetResponseStream();//重要成員//1.ContentLength:接收到數據的長度print(res.ContentLength);//2.ContentType:接收到數據的類型print(res.ContentType);//3.StatusCode:Ftp服務器下發的最新狀態碼print(res.StatusCode);//4.StatusDescription:Ftp服務器下發的狀態代碼的文本print(res.StatusDescription);//5.BannerMessage:登錄前建立連接時Ftp服務器下發的消息print(res.BannerMessage);//6.ExitMessage:Ftp會話結束時服務器發送的消息print(res.ExitMessage);//7.LastModified:Ftp服務器上的文件的上次修改日期和時間print(res.LastModified);#endregion#region 總結//通過C#提供的3個類//我們就可以完成客戶端向Ftp服務器//操作文件的需求,比如//上傳,下載,刪除文件#endregion }// Update is called once per framevoid Update(){}
}

上傳文件到FTP服務器

使用FTP服務器上傳文件的關鍵點

? ? ? ? //1.通信憑證
? ? ? ? // ?進行FTP連接時操作時的賬號和密碼
? ? ? ? //2.操作命令WebRequestMethod.Ftp
? ? ? ? // 設置你想要進行的Ftp操作
? ? ? ? //3.文件流相關FileStream和Stream
? ? ? ? // ?上傳和下載時都會使用到文件流
? ? ? ? //4.保證ftp服務器已經開啟
? ? ? ? // 并且能夠正確訪問

開始上傳

 try{//1.創建一個Ftp連接FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/pic.png")) as FtpWebRequest;//2.設置通信憑證(如果不支持匿名,就必須設置這一步)//將代理相關設置置空 避免服務器同時有http相關服務沖突req.Proxy = null;NetworkCredential n = new NetworkCredential("DamnF", "DamnF123");req.Credentials = n;//請求完畢后,是否關閉控制連接,如果想要關閉,需要設置falsereq.KeepAlive = false;//3.設置操作命令req.Method = WebRequestMethods.Ftp.UploadFile;//設置操作命令為上傳文件//4.指定傳輸類型req.UseBinary = true;//5.得到用于上傳的流對象Stream upLoadStream = req.GetRequestStream();//6.開始上傳using (FileStream file = File.OpenRead(Application.streamingAssetsPath + "/test.png")){//我們可以一點一點的把這個文件中的字節數組讀取出來 然后存到上傳流中byte[] bytes = new byte[1024];//返回值是真正從文件中讀了多少個字節int contentLength = file.Read(bytes, 0, bytes.Length);//不停的去讀取文件中的字節流 除非讀完了 不然一直讀 并且寫入到上傳流中while (contentLength != 0){//寫入上傳流中upLoadStream.Write(bytes, 0, contentLength);//寫完了繼續讀取contentLength = file.Read(bytes, 0, bytes.Length);}//出了循環就證明寫完了file.Close();upLoadStream.Close();//上傳完畢print("上傳完畢");}}catch (Exception e){print("上傳失敗 出錯了" + e.Message);}

從FTP服務器下載文件到客戶端

使用FTP下載文件的關鍵點

? ? ? ? //1.通信憑證
? ? ? ? // 進行FTP文件操作時需要的賬號和密碼
? ? ? ? //2.操作命令WebRequestMethods.Ftp
? ? ? ? // 設置你想要進行的Ftp操作
? ? ? ? //3.文件流相關的FileStream和Stream
? ? ? ? // 上傳和下載時都需要使用的文件流
? ? ? ? // 下載文件流使用FtpWebResponse類獲取
? ? ? ? //4.保證Ftp服務器已開啟
? ? ? ? // 并且能夠正常訪問

開始下載

try{//1.創建一個Ftp連接//這里和上傳不同,上傳的文件名是自己定的 下載的文件名必須是資源服務器里有的FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/文本格式.jpg")) as FtpWebRequest;//2.設置一個通信憑證(如果不支持匿名,就必須設置這一步)//請求完畢后 是否關閉控制連接,如果要進行多次操作 可以設置falseNetworkCredential n = new NetworkCredential("DamnF", "DamnF123");req.Credentials = n;req.KeepAlive = false;//3.設置操作命令req.Method = WebRequestMethods.Ftp.DownloadFile;//4.指定傳輸類型req.UseBinary = true;req.Proxy = null;//5.得到用于上傳的流對象//相當于把請求發送給ftp服務器,就會攜帶我們想要的信息返回FtpWebResponse res = req.GetResponse()as FtpWebResponse;//這就是下載流Stream DownLoadStream = res.GetResponseStream ();//6.開始上傳print(Application.persistentDataPath);using (FileStream file = File.Create(Application.persistentDataPath + "/DamnF112233.jpg")){byte[] bytes = new byte[1024];int contentLength = file.Read(bytes, 0, bytes.Length);while (contentLength != 0){file.Write(bytes, 0, contentLength);contentLength = file.Read(bytes, 0, bytes.Length);}file.Close();DownLoadStream.Close();print("下載完畢");}}catch (Exception e){print("下載出錯了" + e.Message);}

關于FTP服務器的其他操作

?//除了上傳和下載,還有其他操作
? ? ? ? //比如:
? ? ? ? //1.刪除文件
? ? ? ? //2.獲取文件大小
? ? ? ? //3.創建文件夾
? ? ? ? //4.獲取文件列表
? ? ? ? //等等

將文件的上傳,下載,刪除等其他操作使用面向對象的思想用單例模式進行封裝

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;public class FtpMgr
{private static FtpMgr instance=new FtpMgr();public static FtpMgr Instance => instance;//ftp服務器地址private string FTP_PATH = "ftp://127.0.0.1";//用戶名密碼private string USER_NAME = "DamnF";private string PASSWORD = "DamnF123";public async void UpLoadFile(string fileName,string localPath,UnityAction action=null){await Task.Run(() =>{try{//通過一個線程執行這里邊的邏輯,不會影響主線程//1.創建ftp連接FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH+fileName)) as FtpWebRequest;//2.設置通信憑證(如果不支持匿名,就必須設置這一步)//將代理相關設置置空 避免服務器同時有http相關服務沖突req.Proxy = null;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;//請求完畢后,是否關閉控制連接,如果想要關閉,需要設置falsereq.KeepAlive = false;//3.設置操作命令req.Method = WebRequestMethods.Ftp.UploadFile;//4.指定傳輸類型req.UseBinary = true;//5.得到用于上傳的流對象Stream upLoadStream = req.GetRequestStream();//6.開始上傳using (FileStream file = File.OpenRead(localPath)){//我們可以一點一點的把這個文件中的字節數組讀取出來 然后存到上傳流中byte[] bytes = new byte[1024];//返回值是真正從文件中讀了多少個字節int contentLength = file.Read(bytes, 0, bytes.Length);//不停的去讀取文件中的字節流 除非讀完了 不然一直讀 并且寫入到上傳流中while (contentLength != 0){//寫入上傳流中upLoadStream.Write(bytes, 0, contentLength);//寫完了繼續讀取contentLength = file.Read(bytes, 0, bytes.Length);}//出了循環就證明寫完了file.Close();upLoadStream.Close();}//上傳完畢Debug.Log("上傳完畢");}catch (Exception e){Debug.Log("上傳出錯了" + e.Message);}});//上傳結束后,你想在外部做的事情action?.Invoke();}public async void DownLoadFile(string fileName,string localName,UnityAction action=null){await Task.Run(() =>{try{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.KeepAlive = false;req.Proxy = null;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.DownloadFile;FtpWebResponse res = req.GetResponse() as FtpWebResponse;Stream DownLoadStream = res.GetResponseStream();using (FileStream file = File.Create(localName)){byte[] bytes = new byte[1024];int contentLength = file.Read(bytes, 0, bytes.Length);while (contentLength != 0){file.Write(bytes, 0, contentLength);contentLength = file.Read(bytes, 0, bytes.Length);}file.Close();DownLoadStream.Close();Debug.Log("下載完畢");}res.Close();}catch (Exception e){Debug.Log("下載出錯了" + e.Message);}});action?.Invoke();}public async void DeleteFile(string fileName,UnityAction<bool> action=null){await Task.Run(() =>{try{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.DeleteFile;FtpWebResponse res = req.GetResponse() as FtpWebResponse;res.Close();action?.Invoke(true);}catch (Exception e){Debug.Log("刪除文件出錯"+e.Message);action?.Invoke(false);}});}public async void GetFileSize(string fileName,UnityAction<long>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.KeepAlive = false;req.Proxy = null;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.GetFileSize;FtpWebResponse res = req.GetResponse() as FtpWebResponse;action?.Invoke(res.ContentLength);res.Close();});}catch (Exception e){Debug.Log("得到文件大小出錯" + e.Message);}}public async void CreateDirectory(string DirectoryName,UnityAction<bool>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + DirectoryName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.MakeDirectory;FtpWebResponse res = req.GetResponse() as FtpWebResponse;res.Close();action?.Invoke(true);});}catch (Exception e){Debug.Log("文件夾創建失敗" + e.Message);action?.Invoke(false);}}public async void GetFileList(string directoryName,UnityAction<List <string>>action=null){try{await Task.Run(() =>{FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;NetworkCredential n = new NetworkCredential(USER_NAME, PASSWORD);req.Credentials = n;req.Proxy = null;req.KeepAlive = false;req.UseBinary = true;req.Method = WebRequestMethods.Ftp.ListDirectory;FtpWebResponse res = req.GetResponse() as FtpWebResponse;//把下載的信息流轉化為StreamReader對象,方便我們一行一行的讀取信息StreamReader streamReader = new StreamReader(res.GetResponseStream());//用于存儲文件名的列表List<string> nameStrs = new List<string>();//一行一行的讀取信息string line= streamReader.ReadLine();while(line!=null){nameStrs.Add(line);line = streamReader.ReadLine();}action?.Invoke(nameStrs);res.Close();});}catch (Exception e){Debug.Log("文件列表返回失敗" + e.Message);action?.Invoke(null);}}
}

測試FTPMgr模塊的功能

   FtpMgr.Instance.UpLoadFile("/DamnFPic.png", Application.streamingAssetsPath + "/test.png", () =>{print("上傳成功,調用委托函數");});print("測試測試");print(Application.persistentDataPath);FtpMgr.Instance.DownLoadFile("/文本格式.jpg", Application .persistentDataPath +"/zhangdeshuai1234.jpg", () => {print("下載成功,調用委托函數");});print("測試測試");
 //1.刪除文件FtpMgr.Instance.DeleteFile("/Pic.png", (result) =>{print(result ? "刪除完畢" : "刪除失敗");});//2.獲取文件大小FtpMgr.Instance.GetFileSize("/文本格式.jpg", (result) => {print("文件大小是:" + result);});//3.創建文件夾FtpMgr.Instance.CreateDirectory("/DamnF", (result) => {print(result ? "創建成功" : "創建失敗");});//4.獲取文件列表FtpMgr.Instance.GetFileList("", (list) => {if(list==null){print("返回文件列表失敗");return;}else{for (int i = 0; i < list.Count ; i++){print(list[i]);}}});

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

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

相關文章

Day92 | 靈神 | 二叉樹 路徑總和

Day92 | 靈神 | 二叉樹 路徑總和 112.路徑總和 112. 路徑總和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 1.遞歸函數意義 如果在根節點為t的樹中可以找到長度為target的路徑就返回true&#xff0c;找不到就返回false 2.參數和返回值 bool tra(TreeNode …

探索鴻蒙應用開發:ArkTS應用執行入口揭秘

# 探索鴻蒙應用開發&#xff1a;ArkTS應用執行入口揭秘 在鴻蒙應用開發的領域中&#xff0c;ArkTS作為聲明式開發語言&#xff0c;為開發者們帶來了便捷與高效。對于剛接觸鴻蒙開發的小伙伴來說&#xff0c;搞清楚ArkTS應用程序的執行入口是邁向成功開發的關鍵一步。今天&…

【Web API系列】Web Shared Storage API之WorkletSharedStorage深度解析與實踐指南

前言 在現代Web開發領域&#xff0c;數據存儲與隱私保護的矛盾始終存在。傳統存儲方案如LocalStorage和Cookies面臨著日益嚴格的安全限制&#xff0c;而跨域數據共享的需求卻在持續增長。正是在這樣的背景下&#xff0c;Web Shared Storage API應運而生&#xff0c;其核心組件…

探索鴻蒙沉浸式:打造無界交互體驗

一、鴻蒙沉浸式簡介 在鴻蒙系統中&#xff0c;沉浸式是一種極具特色的設計理念&#xff0c;它致力于讓用戶在使用應用時能夠全身心投入到內容本身&#xff0c;而盡可能減少被系統界面元素的干擾。通常來說&#xff0c;就是將應用的內容區巧妙地延伸到狀態欄和導航欄所在的界面…

機器學習03——K近鄰

K近鄰算法學習筆記 一、算法簡介 K近鄰算法&#xff08;K - Nearest Neighbors&#xff0c;簡稱KNN&#xff09;是一種簡單而有效的分類和回歸算法。它的核心思想是“近朱者赤&#xff0c;近墨者黑”&#xff0c;即一個數據點的類別或值可以通過其周圍最近的K個鄰居來判斷。K…

序列化 反序列化實例

在Python中&#xff0c; pickle 模塊常用于實現對象的序列化和反序列化&#xff0c;以下是一個簡單的實例&#xff1a; import pickle # 定義一個類 class Person: def __init__(self, name, age): self.name name self.age age # 創建一個Person對象 person Person("…

代碼隨想錄算法訓練營第十九天

LeetCode題目: 77. 組合216. 組合總和 III17. 電話號碼的字母組合2537. 統計好子數組的數目(每日一題)516. 最長回文子序列1039. 多邊形三角剖分的最低得分543. 二叉樹的直徑124. 二叉樹中的最大路徑和2246. 相鄰字符不同的最長路徑 其他: 今日總結 往期打卡 77. 組合 跳轉: 7…

存算分離看場景

計算機行業是唯一一個比時裝行業概念更多的行業。概念頻出&#xff0c;最慢的話半年一定出一個&#xff0c;短的話半個月就能看到新的名詞和技術甚至是概念。 存算分離的概念 我第一次聽到存算分離時候還是從Hadoop上聽到的。然后就去問什么是存算分離。聽了講解以后&#xf…

MCP協議,.Net 使用示例

服務器端示例 基礎服務器 以下是一個基礎的 MCP 服務器示例&#xff0c;它使用標準輸入輸出&#xff08;stdio&#xff09;作為傳輸方式&#xff0c;并實現了一個簡單的回顯工具&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.H…

智能語音處理+1.5使用PocketSphinxshinx實現語音轉文本(100%教會)

歡迎來到智能語音處理系列的最后一篇文章&#xff0c;到這里,基本上語音處理是沒問題了. 第一篇:智能語音處理1.1下載需要的庫(100%實現)-CSDN博客 第二篇:智能語音識別1.2用SAPI實現文本轉語音(100%教會)-CSDN博客 第三篇:智能語音處理1.3用SpeechLib實現文本轉語音(100%教會)…

Kubernetes 節點摘除指南

目錄 一、安全摘除節點的標準流程 1. 確認節點名稱及狀態 2. 標記節點為不可調度 3. 排空&#xff08;Drain&#xff09;節點 4. 刪除節點 二、驗證節點是否成功摘除 1. 檢查節點列表 2. 檢查節點詳細信息 3. 驗證 Pod 狀態 三、徹底清理節點&#xff08;可選&#xf…

信息安全管理與評估2021年國賽正式卷答案截圖以及十套國賽卷

2021年全國職業院校技能大賽高職組 “信息安全管理與評估”賽項 任務書1 賽項時間 共計X小時。 賽項信息 賽項內容 競賽階段 任務階段 競賽任務 競賽時間 分值 第一階段 平臺搭建與安全設備配置防護 任務1 網絡平臺搭建 任務2 網絡安全設備配置與防護 第二…

3D語義地圖中的全局路徑規劃!iPPD:基于3D語義地圖的指令引導路徑規劃視覺語言導航

作者&#xff1a; Zehao Wang, Mingxiao Li, Minye Wu, Marie-Francine Moens, Tinne Tuytelaars 單位&#xff1a;魯汶大學電氣工程系&#xff0c;魯汶大學計算機科學系 論文標題&#xff1a; Instruction-guided path planning with 3D semantic maps for vision-language …

《AI大模型應知應會100篇》第20篇:大模型倫理準則與監管趨勢

第20篇&#xff1a;大模型倫理準則與監管趨勢 摘要 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;尤其是大模型&#xff08;如GPT、PaLM等&#xff09;在自然語言處理、圖像生成等領域的廣泛應用&#xff0c;AI倫理問題和監管挑戰日益凸顯。本文將梳理當…

【Ai】dify:Linux環境安裝 dify 詳細步驟

一、什么是dify Dify 是一個 開源的大語言模型(LLM)應用開發平臺,旨在幫助開發者快速構建基于 AI 的應用程序,例如智能對話助手、知識庫問答、內容生成工具等。它提供了可視化的流程編排、模型集成、數據管理等功能,降低了開發門檻,支持快速迭代和部署。 核心功能與特點…

CentOS 操作系統下搭建 tsung性能測試環境

寫在前面 為何這么安裝,實際就是這么做的,這是經過好幾次實踐得出的經驗總結。 這為了讓大家更清楚的知道怎么安裝 tsung性能測試環境,按步照搬的安裝即可。 步驟 1、 下載軟件安裝包 CentOS-6.0-x86_64-bin-DVD1.iso jdk-6u4-linux-x64-rpm.bin erlang: otp_src_1…

Vulkanised

Vulkanised 1. About VulkanisedReferences The Premier Vulkan Developer Conference premier /?premi?(r)/ n. 總理&#xff1b;(尤用于報章等) 首相&#xff1b;(加拿大的) 省總理&#xff1b;地區總理 adj. 第一的&#xff1b;首要的&#xff1b;最著名的&#xff1b;最…

C++之 動態數組

一、新建一個動態數組 數組名和下標操作符[]的組合可以被替換成一個指向該數組的基地址的指針和對應的指針運算&#xff1a; int a[20]; int *x a; 指針變量 x 指向數組 a 的地址&#xff0c; a[0] 和 *x 都代表數組的第一個元素。 于是&#xff0c;根據指針運算原則&…

ubuntu1804服務器開啟ftp,局域網共享特定文件給匿名用戶

要在 Ubuntu 18.04 上設置一個 FTP 服務器&#xff0c;滿足以下要求&#xff1a; 允許匿名登錄&#xff08;無需賬號密碼&#xff09;。指定分享特定目錄下的文件。只允許只讀下載。 可以使用 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;來實現。以下是詳細步驟&a…

mcp和API區別

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;與傳統API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;在技術架構、集成方式和應用場景等方面存在顯著差異&#xff0c;以下是主要區別的總結&#x…