- A+
这是一个我个人写的库,主要实现的是基于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来返回文件,这样你可以直接吧这些资源嵌入到页面中,比如视频,图片等,可以直接在页面上浏览播放,不像一众网盘那样,网盘里的东西只能自己看,分享后也只能在他自己的网盘客户端或者网站上才能浏览,不能把链接嵌入到网站中随时去浏览。