這是一個我個人寫的庫,主要實現的是基於tcpclient的網站外擴網盤的解決方案,可以使用家用網路外掛個人電腦中的資源到自己的網站上,已經上傳nuget,大家可以直接在nuget包管理中搜索到,直接搜索ZmjNetDisk即可,下麵介紹具體的使用方式: 另外一提這個庫做的比較的個人化,因為他就是為了 ...
這是一個我個人寫的庫,主要實現的是基於tcpclient的網站外擴網盤的解決方案,可以使用家用網路外掛個人電腦中的資源到自己的網站上,已經上傳nuget,大家可以直接在nuget包管理中搜索到,直接搜索ZmjNetDisk即可,下麵介紹具體的使用方式:
另外一提這個庫做的比較的個人化,因為他就是為了我的網站而服務的,我的網站是store.zhaimaojun.cn,大家可以去體驗一下實際的效果,也可以搜索微信小程式 什邡市宅貓君網路工作室,我做了網頁版和小程式版,都是基於這個庫。未來有空我可以再升級一下,改成更加泛化的,再改成多中心式的,如果有誰有資金想去搞一搞的話,弄成多中心式,就像p2p一樣文件可以傳輸的帶寬和速率就更快更好了,當然也可能不能和傳統的p2p去抗衡吧,唯一的優點就是顛覆傳統的網盤模式,可以把資源嵌入到頁面中瀏覽,而不是必須在指定的頁面或者客戶端才能瀏覽。
第一步 獲取和安裝庫
第二步 伺服器端和客戶端開啟服務
1 /**伺服器開啟服務,這個需要運行在網站端*/ 2 var nd = new ZmjNetDisk.NetDiskServer(new ZmjNetDisk.NetDiskServerConfig { Ip = "0.0.0.0", Port = 11111, });//埠可以隨意根據自己需求 3 nd.StartListen();//必須要調用startlisten來開啟偵聽,也可以調用stoplisten來停止偵聽,可以多次調用
1 /**客戶端開啟服務*/ 2 var diskClient = new NetDiskClient(SearchPicture, SearchVideo, SearchSource, GetSourceInfo, ScaleImage, new NetDiskClientConfig { ServerIp = "你的伺服器ip", Port = 11111, ConnectTimeout = 12000, });//新建客戶端服務對象 3 diskClient.NoticeMsg += DiskClient_NoticeMsg;//這裡自定義對通知的處理 4 diskClient.Start();//調用start來開啟服務 5 diskClient.Client.Client.Send(new byte[1] { 0 });//這裡必須間歇性的發送一個0,兩個作用,一是快速發現掉線情況,二是防止tcp鏈接假死。可以定時發送,比如15-30秒發送一次即可,這種發送不影響整體通訊 6 /**這裡需要額外註意的是,調用start會額外開啟線程去處理伺服器發來的命令,但是diskClient應該要定時的去檢測鏈接的有效性,失效了應該積極主動的去重新鏈接,也就是dispose之後重新new,再start*/
客戶端在新建的時候需要提供五個方法,這5個方法含義如下:
SearchPicture:這是隨機獲取圖片的,傳入寬高和查看級別來獲取對應的一張隨機圖片,返回圖片的code,用於獲取圖片
SearchVideo:這是隨機獲取視頻的,傳入視頻文件大小來獲取指定大小以下的短視頻資源,返回視頻的code,用於獲取視頻
SearchSource:這是搜索指定類型和級別的資源的,返回格式化的資源對象,用於傳輸給伺服器端,
GetSourceInfo:這是獲取指定的資源詳細內容的,返回格式化的資源對象,
ScaleImage:這是用於縮放圖片的,傳入圖片和需要縮放到的大小,返回圖片縮放到指定大小後的文件流
第三步 伺服器端搜索資源和獲取資源
1 /**伺服器端獲取文件*/ 2 using var file = await Task.Run(() => Server.WaitForGetFile("要獲取的文件的code", 獲取的文件的開始位置, 獲取文件的結束位置,可以是-1, 用於取消的token)) ?? throw new BadHttpRequestException("找不到指定的文件", (int)HttpStatusCode.NotFound); 3 /**伺服器端獲取縮放後的圖片,縮放傳入0,0表示不縮放*/ 4 using var file = await Task.Run(() => Server.WaitForGetImage("圖片的code", 開始, 結束, 縮放寬度, 縮放高度, 取消token)) ?? throw new BadHttpRequestException("找不到指定的文件", (int)HttpStatusCode.NotFound); 5 /**隨機獲取圖片的code,寬高用於標識需要獲取的圖片的寬高比和像素水平,例如水平的2k或4k圖,或者垂直的4k或8k圖等*/ 6 var rcode = Server.RandomPicture(w, h, level)?.SourceCode; 7 /**隨機獲取視頻的code,時間用於限制獲取的視頻的文件大小*/ 8 var code = Server.RandomVideo(30000000, level)?.SourceCode; 9 /**伺服器端搜索指定關鍵詞的資源,搜索出來的是很多資源*/ 10 var sources = Server.SearchSource(NetDiskSourceType.game, level, "要搜索的關鍵詞", 0, 8, NetDiskSourceOrderType.none, out _);//其中資源類型有多種,可根據資源類型區分不同的資源來搜索,0和8用於形成頁,比如每頁是8個,0,8就表示第一頁,8,8表示第二頁,16,8表示第三頁以此類推,後面的排序類型需要在資源搜索的方法中自行實現 11 /**伺服器端獲取指定資源的詳細內容,包括資源中有什麼文件,有什麼圖片等等*/ 12 var source = Server.GetSource("資源的code"); 13 /**伺服器端獲取指定的資源文件所在的資源的整體信息,可以同時獲取到該資源下所有的其他的文件,常用於視頻播放時看它的上一個視頻和下一個視頻等*/ 14 var source = server.GetFileInfo("資源文件的code");
由於這個是伺服器端主動發送命令給客戶端,客戶端處理完命令後再發回給伺服器的方式,所以客戶端這邊不需要太多的處理,客戶端這邊可以直接寫成一個後臺運行的服務,這樣就可以不需要管了,而伺服器端這邊是可以主動隨時發起請求的。下載文件時,用戶直接請求伺服器,伺服器再請求客戶端,然後客戶端把文件發送到伺服器,伺服器再轉發給客戶這種模式。這就要求需要有一個固定的帶寬還可以的伺服器作為中介來實現內網穿透。
這個庫的優點是,獲取文件後可以用api來返迴文件,這樣你可以直接吧這些資源嵌入到頁面中,比如視頻,圖片等,可以直接在頁面上瀏覽播放,不像一眾網盤那樣,網盤裡的東西只能自己看,分享後也只能在他自己的網盤客戶端或者網站上才能瀏覽,不能把鏈接嵌入到網站中隨時去瀏覽。