zoukankan      html  css  js  c++  java
  • 调用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#的。

  • 相关阅读:
    Flask 的 请求扩展 与 中间件
    Flask的配置文件 与 session
    django中的FBV和CBV
    Flask开启多线程、多进程
    WPF获取原始控件样式
    一个40岁老码农的总结,奋斗没有意义,选择大于努力
    FastText 分析与实践
    Flask的多app应用,多线程如何体现
    Python 远程调用MetaSploit
    GitLab 7.5.3 CentOS7安装和SMTP配置
  • 原文地址:https://www.cnblogs.com/dachie/p/1809474.html
Copyright © 2011-2022 走看看