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#的。

  • 相关阅读:
    elasticsearch 中的Multi Match Query
    activiti 流程部署的各种方式
    elasticsearch 嵌套对象之嵌套类型
    elasticsearch Java High Level REST 相关操作封装
    elasticsearch 字段数据类型
    ubuntu 安装 docker
    elasticsearch 通过HTTP RESTful API 操作数据
    facenet 人脸识别(二)——创建人脸库搭建人脸识别系统
    POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
    墨卡托投影, GPS 坐标转像素, GPS 坐标转距离
  • 原文地址:https://www.cnblogs.com/dachie/p/1809474.html
Copyright © 2011-2022 走看看