调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载,为我们获取互联网资料提供了一个强有力的工具,它可以争取最大的带宽,获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等,后来许多传统“多线程断点续传类”软件,也增加了对的支持,这些常见的有网际快车、迅雷、QQ的超级旋风等。其中迅雷最有代表性,它不但支持BT和电骡,还率先使用了P2SP(Peer to Server&Peer 点对服务器和点对服务器和用户)、超线程等技术,因此具备了资源丰富、下载速度快速等特性。

对于个人家庭用户,使用迅雷可以最大化利用带宽,但这种方式在局域网环境下就严重影响其他用户了。迅雷在全速运行时,可以抢占出口带宽,导致其他用户网速奇慢,甚至简单的上网浏览都无法正常使用,这使得网管头痛不已。

针对此问题,迅雷公司推出了“网吧版迅雷”,试图解决此项问题。但经过笔者使用,发现实际并不理想。

网吧版迅雷,分为服务端与客户端,使用服务端来控制客户端的下载流量,进而实现对迅雷抢占带宽的控制。客户端在安装后,以前的迅雷普通版就不能运行了,会有“管理员限制”提示。但是通过研究发现,这个功能就是在系统启动时加载了一个XLLoad.exe程序,实现对普通版迅雷的控制,因此只要在进程中结束改程序,以前的迅雷就可以启动了,如果使用简单的MSConfig工具,限制其运行,可以理解网吧版迅雷就不起任何作用了。

客户端迅雷接受服务端下载速度的限制,只是通过简单的数据传递,并不是由服务端代理下载,还是需要客户端自己搜索种子进行下载的。因此,如果路由器对客户机限制了相应的资源服务器IP以及下载需要的端口,客户机是无法正常进行下载的。

因此笔者认为,网吧版迅雷只适合网吧环境,或者说适合对客户端有严格控制的环境,如网吧、电子阅览室、学生机房等等,而且路由器不能做任何IP、端口的限制。因为这些环境下,客户机都会有系统还原机制,即便是客户端迅雷被卸载掉,系统重启后,又会恢复原来的控制状态。

为此,笔者思考,能否开发一个真正适合局域网环境下的迅雷呢?既保证网络带宽不会被无休止的抢占,又能让用户进行必要的,受控的下载呢?局域网的路由器限制了迅雷资源服务器IP、通讯用的端口,这时客户端使用迅雷只能从源地址下载,我们希望有网络中的一台服务器,代理客户进行下载,而且下载速度又是可控的。具体思路如下:

1、路由器上进行针对客户机的必要的限制(黑名单限制IP、白名单开启迅雷以外端口)

2、服务器安装IIS,使其支持ASP和Access数据库。

3、服务器安装单机版迅雷,并限制好合理的下载/上传速率,注意要使用老版本(后面会有说明)。

4、客户端能够通过IE访问服务器的Web页面,实习任务提交。

5、客户机IE安装右键提交任务功能,比如叫“使用局域网迅雷下载”。

使用时,客户机通过服务器页面登陆,打开“狗狗”搜索器或者直接在迅雷页面中输入关键词。找到连接后,使用鼠标右键的“使用局域网迅雷下载”,进入任务添加页面,确认后,此记录添加到数据库,并使得服务端的迅雷接受任务,开始下载。

在Web页面中,会显示当前各个任务的下载情况,完成后提供服务上文件的下载链接。实现这些基础应用后,我们还可以添加其它功能,如:已下载清单列表,方便其他用户直接在局域网内下载,避免占用互联网出口带宽,也节省时间;开启用户任务总数或者字节总数限制,合理分配内网用户对互联网带宽的占用;监控每个用户下载文件类型,方便内部管理;控制迅雷的带宽占用限制,在网络不繁忙时(下班后、晚上)让迅雷全速运行。

实现以上的应用,开发的重点就是利用迅雷提供API接口,这个接口一COM组件,其最主要的功能就是实现在IE中,使用鼠标右键添加任务至迅雷。不过其组件还有其它丰富的功能,这位我们进行二次开发,提供了可能。

组件名称:ThunderAgent

文件路径:

C:\Program Files\Thunder Network\Thunder\ComDlls\ThunderAgent_now.dll

注册:安装迅雷时自动注册

开发环境:VB6、VS2005、ASP等

接口函数:

一、返回组件信息

函数名:GetInfo( )

格式:组件对象名. GetInfo(pInfoName)

说明:返回值为对应pInfoName的字符串信息。

pInfoName值

含义

返回值格式

“ThunderExists”

迅雷是否存在

“true”/“false”

“ThunderRunning”

迅雷是否运行

“true”/“false”

“ThunderVersion”

迅雷版本号

“x.x.x.x”

“PlatformVersion”

组件版本号

“x.x.x.x”

二、加入任务

函数名:AddTask( )

格式:组件对象名.AddTask("pURL ", " pFileName ", " pPath "," pComments "," pReferURL "," nStartMode ", " nOnlyFromOrigin "," nOriginThreadCount ")

说明:参数均为字符型,含义如下表

参数名

含义

pURL

目标URL,必须参数

pFileName

另存名称,默认为空,表示由迅雷处理,可选参数

pPath

存储目录,默认为空,表示由迅雷处理,可选参数

pComments

下载注释,默认为空,可选参数

pReferURL

引用页URL,默认为空,可选参数

nStartMode

开始模式,0手工开始,1立即开始,默认为-1,表示由迅雷处理,可选参数

nOnlyFromOrigin

是否只从原始URL下载,1只从原始URL下载,0多资源下载,默认为0,可选参数

nOriginThreadCount

原始地址下载线程数,范围1-10,默认为-1,表示由迅雷处理,可选参数

三、提交任务

函数名:CommitTasks( )

格式:组件对象名.CommitTasks( )

说明:把AddTask所加入的下载任务信息真正提交到迅雷中。当此语句运行后,默认情况下迅雷会出现一个添加任务的确认对话框,为了实现服务端无人职守运行,因此可以在迅雷中做如下设置:工具→配置→高级,把“通过IE右键菜单 使用迅雷下载 添加任务”选项前面的勾去掉。然后在程序中使用“异步提交”方式任务提交,具体命令为:组件对象名.CommitTasks2(1)

四、查询任务信息

函数名:GetTaskInfo( )

格式:组件对象名. GetTaskInfo(pURL, pInfoName)

说明:pURL表示所要查询任务的URL地址,pInfoName参数见下表

参数名

含义

“Exists”

是否在迅雷的任务列表

“Path”

存储目录

“FileName”

文件名称

“FileSize”

文件大小

“CompletedSize”

已下载大

“Percent”

下载进度

“Status”

任务状态

返回值:

参数

返回值

“Exists”

“true”存在,“false”不存在

“Path”

存储目录,最后带反斜线\

例:C:\TDDownload\

“FileName”

文件名称

“FileSize”

文件大小,以字节为单位

0表示大小未知

“CompletedSize”

已下载大小,以字节为单位

“Percent”

下载进度,带1位小数,例:70.0

“Status”

任务状态,有以下6种状态

“running”

运行

“stopped”

停止

“failed”

失败

“success”

成功态

“creatingfile”

正在创建文件

“connecting”

正在连接

五、例子

1、查询迅雷是否存在(VB6)

Private Sub Form_Load()

Set ThunderAgent = CreateObject("ThunderAgent.Agent.1")

MsgBox ThunderAgent.GetInfo("ThunderExists")

Set ThunderAgent = Nothing

End Sub

2、添加下载任务VB.net

Imports System

Imports System.Text

Public Class frmThunderClass

Private _iStartMode As Integer '讯雷任务下载开始模式

'创建讯雷调用对象

Private ThunderEng As New THUNDERAGENTLib.Agent

'开始下载任务

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartDown.Click

Dim iOnlyFromOrigin, iOriginThreadCount As Integer

iOnlyFromOrigin = IIf(chkOnlyFromOrigin.Checked = True, 1, 0)

iOriginThreadCount = CInt(txtOriginThreadCounts.Text)

If chkDefault.Checked Then

iOriginThreadCount = -1

End If

ThunderEng.AddTask(txtURL.Text, txtSaveAsFileName.Text, txtSaveDir.Text, txtComment.Text, _

txtReferencePage.Text, _iStartMode, iOnlyFromOrigin, iOriginThreadCount)

ThunderEng.CommitTasks()

End Sub

End Class

3、显示下载信息 VB.net

sStatus = ThunderEng.GetTaskInfo(txtURL.Text, "Status")

sFileSize = ThunderEng.GetTaskInfo(txtURL.Text, "FileSize")

sDownedSize = ThunderEng.GetTaskInfo(txtURL.Text, "CompletedSize")

sFileName = ThunderEng.GetTaskInfo(txtURL.Text, "FileName")

lblDownedSize.Text = String.Format(lblDownedSize.Tag, sDownedSize)

lblFileSize.Text = String.Format(lblFileSize.Tag, sFileSize)

lblTaskStatus.Text = String.Format(lblTaskStatus.Tag, sStatus)

lblFilename.Text = String.Format(lblFilename.Tag, sFileName)

sPercent = ThunderEng.GetTaskInfo(txtURL.Text, "Percent")

4、获取迅雷组件信息 ASP

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>无标题文档</title>

</head>

<body>

<%

Set ThunderAgent = CreateObject("ThunderAgent.Agent.1")

Response.Write("迅雷安装状态:")

Response.Write(ThunderAgent.GetInfo("ThunderExists"))

Response.Write("<p>")

Response.Write("迅雷是运行状态:")

Response.Write(ThunderAgent.GetInfo("ThunderRunning"))

Response.Write("<p>")

Response.Write("迅雷版本号:")

Response.Write(ThunderAgent.GetInfo("ThunderVersion"))

Response.Write("<p>")

Response.Write("组件版本号:")

Response.Write(ThunderAgent.GetInfo("PlatformVersion"))

Response.Write("<p>")

Set ThunderAgent = Nothing

%>

</body>

</html>

此外IE鼠标右键需要有获取任务URL的功能,具体做法是修改注册表:

在注册表的

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项

下建立一个新项,名称可以写“实用局域网迅雷下载”,这就是将来在IE右键快捷菜单中显示的。将新建项的默认值设定为一个URL地址,当用户点击菜单项后,IE就会调用URL指向的页面中的脚本,如:

<script language="VBScript">

Sub OnContextMenu()

On Error Resume Next

set srcEvent = external.menuArguments.event

set EventElement = external.menuArguments.document.elementFromPoint(srcEvent.clientX, srcEvent.clientY)

set objNetSamp=CreateObject("NetSamp.NetAPI")

if srcEvent.type = "MenuExtAnchor" then

set srcAnchor = EventElement

do until TypeName(srcAnchor)="HTMLAnchorElement"

set srcAnchor=srcAnchor.parentElement

Loop

Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)

elseif srcEvent.type="MenuExtImage" then

if TypeName(EventElement)="HTMLAreaElement" then

Call objNetSamp.AddUrl(EventElement.href,EventElement.Alt)

else

set srcImage = EventElement

set srcAnchor = srcImage.parentElement

do until TypeName(srcAnchor)="HTMLAnchorElement"

set srcAnchor=srcAnchor.parentElement

if TypeName(srcAnchor)="Nothing" then

call objNetSamp.AddUrl(srcImage.href,srcImage.Alt)

exit sub

end if

Loop

Call objNetSamp.AddUrl(srcAnchor.href, srcImage.Alt)

end if

elseif srcEvent.type="MenuExtUnknown" then

set srcAnchor = EventElement

do until TypeName(srcAnchor)="HTMLAnchorElement"

set srcAnchor=srcAnchor.parentElement

if TypeName(srcAnchor)="Nothing" then

Call objNetSamp.AddUrl(EventElement.href,EventElement.innerText)

exit sub

end if

Loop

Call objNetSamp.AddUrl(srcAnchor.href,srcAnchor.innerText)

end if

end Sub

call OnContextMenu()

</script>

上面的例子是调用NetSamp.NetAPI组件,实现URL的传递。这里可以修改为将URL传递给添加任务的页面,实现写入数据库和调用迅雷组件添加任务的目的。

利用ASP脚本可以再添加注册、登陆等页面就基本完善了。

以上为转载,肯定有用,先留着,有时间了转成C#的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法&#xff0c;因为大多数初学者习惯使用虚拟机&#xff0c;这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…

项目管理最佳实践方法_项目管理:控制项目进度最佳实践

5分钟站立会议5 MinutesStand-up Meeting&#xff08;5分钟站立会议&#xff09;是实践中项目进度管理的好办法。5分钟站立会议时&#xff0c;项目团队成员在固定时间&#xff08;如每天上午8:30&#xff5e;8:35&#xff09;、固定地点&#xff0c;每天站着围在一起&#xff0…

《海龟交易法则》经典梳理

序言&#xff0c;第一&#xff5e;第三章 海归交易法则序言本书是历史上最好的5本交易学著作之一的理由&#xff1a;1&#xff0c;重要的不是交易系统而是交易者贯彻交易系统的能力。2&#xff0c;用浅显易懂的语言阐述行为金融学的某些原理如何用于交易和影响交易。3&#xff…

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward&#xff0c;他于2006年由于在开发Valgrind上的工作获得了第二届Google-OReilly开源代码奖。 Valgrind遵守GNU通用公共许可证条款&#xff0c;是一款自由软件。 官网…

hibernate保存失败_Hibernate:保存与保存并保存或更新

hibernate保存失败save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题&#xff0c;就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save &#xff0c; saveOrUpdate和persist等方法将对象保存…

BZOJ 2957 楼房重建-线段树

这个题最主要的是解决一个统计答案的问题。 首先我们注意到&#xff0c;只要考虑右区间的答案统计就好了。 记左区间的最大值为K&#xff0c;当前右区间为P。 我们把当前右区间又分成两个子区间&#xff0c;s1,s2。 那么如果s1的最大值比K小&#xff0c;那么显然只要递归处理s2…

matlab 移动平均_两所高校被禁用MATLAB背后,是工业设计能力之争

不管是MATLAB&#xff0c;还是EDA&#xff0c;都指向了中国核心工业软件缺失的问题。 作者&#xff5c; Decode 邮箱&#xff5c;oudibjoutlook.com来源丨人民数字与品玩联合出品一款工科软件&#xff0c;最近成为科研界议论的焦点。2020 年 6 月 6 日开始&#xff0c;哈尔滨工…

MySQL 当记录不存在时insert,当记录存在时update

MySQL 当记录不存在时insert&#xff0c;当记录存在时更新 网上基本有三种解决方法。 第一种&#xff1a; 示例一&#xff1a;insert多条记录 假设有一个主键为 client_id 的 clients 表&#xff0c;可以使用下面的语句&#xff1a; INSERT INTO clients (client_id, client_na…

如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

英文原文&#xff1a;How to Detect Memory Leaks Using Valgrind memcheck Tool for C / C 系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统&#xff0c;你就需要面对越多的内存问题。有时这些问题非常琐碎&#xff0c;而更多时候它会演变成一个…

如何在Activiti中使用瞬态变量

我们昨天发布的Activiti v6 Beta3中已经加入了一个非常需要的功能-临时变量。 在本文中&#xff0c;我将向您展示一个示例&#xff0c;该示例说明如何使用瞬态变量来覆盖一些以前不可能&#xff08;或最佳&#xff09;的高级用例。 到目前为止&#xff0c;Activiti中的所有变量…

python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?

今天用Python求解「羊车门」经典的概率问题,对概率学基础和Python语法的灵活运用有所收货.本次「羊车门」求解过程采用的是:穷举法计算概率已验证概率学基础理论.期间重点借鉴了奥卡姆剃刀的博客和 南葱&#xff1a;「羊车门」经典概率题中不换门选中车的概率是多少&#xff1f…

非标协议外设LCD1602

概述 LCD1602 &#xff08; Liquid Crystal Display &#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符 (16 列两行) 引脚说明 第 1 脚 : VSS 为电源地 第 2 脚 : VDD 接 5V 正电源 第 3 脚 : VL 为液晶显示器对比度调整端 , 接正电源…

50: Luogu P4568 分层图

分层图最短路模板 #include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> #include <queue> #include <cstring>using namespace std;const int M 2e6 5e5 10;#define gc getchar() inline int read() {int x 0…

C++编程笔记:dll的生成与使用

1.动态链接库&#xff08;dll&#xff09;概述 没接触dll之前觉得它很神秘&#xff0c;就像是一个黑盒子&#xff0c;既不能直接运行&#xff0c;也不能接收消息。它们是一些独立的文件&#xff0c;其中包含能被可执行程序或其他dll调用来完成某项工作的函数&#xff0c;只有在…

如何通过IP地址分辨公网、私网、内网、外网

如何通过IP地址分辨公网、私网、内网、外网内、外网是相对于防火墙而言的&#xff0c;在防火墙内部叫做内网&#xff0c;反之就是外网。在一定程度上外网等同于公网&#xff0c;内网等同于私网。地址为如下3个区域就是处于私网&#xff1a;1&#xff1a;10.*.*.*2&#xff1a;1…

python画动态表情包_真香!一行Python代码,帮你制作小姐姐的表情包,靠谱吗?...

原标题&#xff1a;真香&#xff01;一行Python代码&#xff0c;帮你制作小姐姐的表情包&#xff0c;靠谱吗&#xff1f;(我的IU女神)对于小姐姐的动态表情包&#xff0c;相必我们大多数人都不会拒绝&#xff0c;而且都会选择默默的将其收藏(不要问我怎么知道的)&#xff0c;一…

mongodb分片

mongodb分片&#xff1a; 本次是用三台主机搭建3个集群&#xff08;主、备、仲裁&#xff09;作为三个分片&#xff0c;一个集群&#xff08;主、备、备&#xff09;做为config服务器&#xff0c;三个mongos单点做路由&#xff0c;每台5个&#xff0c;一共15个。 新建一个mongo…

批量添加PDF帐号目录

本文参考&#xff1a;https://blog.csdn.net/qq_34104395/article/details/78766400然后根据需要整理的。如作者介意请留言&#xff0c;本人会尽快处理&#xff01; 准备材料&#xff1a; 下载工具FreePic2Pdf&#xff08;在本博客上传资料上找PDF转换工具包&#xff09; 找到…

驳斥5条普通流Tropes

我刚读完“ JDK 8收集器的强大功能的一种例外” &#xff0c;我不得不说我很失望。 Java冠军 Simon Ritter是Oracle的前Java推广者&#xff0c;现在是Oracle的Java传播者&#xff0c;现在是Azul Systems的副CTO&#xff08;使用JVM的人 &#xff09;写了它&#xff0c;因此我希…