Azureus源码剖析(一)

整个项目运行的起点在com.aelitis.azureus.ui.Main这个类中,它只有一个main主方法,运用Java的反射机制来调用真正的起始点类org.gudy.azureus2.ui.swt.Main的实例对象。

代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->finalClassstartupClass=Class.forName("org.gudy.azureus2.ui.swt.Main");

finalConstructorconstructor=startupClass.getConstructor(newClass[]{
String[].
class
});

constructor.newInstance(
newObject[]{
args
});

而在org.gudy.azureus2.ui.swt.Main这个类中有一个成员变量

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->StartServerstartServer

它是一个监听服务器,对本地的6880端口进行监听,监听的对象是torrent种子文件的URL地址,在它的构造函数中有如下语句:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->socket=newServerSocket(6880,50,InetAddress.getByName("127.0.0.1"));//种子文件监听服务器

state
=STATE_LISTENING;//服务器状态设置为“监听中”

对此我们来做个小实验,通过tcp连接到Azureus的种子文件监听服务器上,向它传递待下载的种子文件列表,从而让Azureus去下载。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->packagecom.vista.test;

importjava.io.IOException;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
importjava.net.Socket;
importjava.net.UnknownHostException;

/**
*
*
@authorphinecos
*
@since2009-5-6
*
*/
publicclassMyClass
{
privateString[]files=null;
publicMyClass(String[]files)
{
this.files=files;
}
@Override
publicStringtoString()
{
StringBuildersb
=newStringBuilder();
for(Stringfile:files)
{
sb.append(file);
}
returnsb.toString();
}
publicvoidsendMessage()
{
Socketsocket
=null;
PrintWriterpw
=null;
Stringmsg
="StartSocket:passingstartupargstoalready-runningAzureusjavaprocesslisteningon[127.0.0.1:6880]";
StringIpAddr
="127.0.0.1";
intport=6880;
finalStringACCESS_STRING="AzureusStartServerAccess";

try
{
socket
=newSocket(IpAddr,port);
pw
=newPrintWriter(newOutputStreamWriter(socket.getOutputStream(),"UTF8"));
StringBufferbuffer
=newStringBuffer(ACCESS_STRING+";args;");

for(inti=0;i<files.length;++i)
{
Stringfile
=files[i].replaceAll("&","&&").replaceAll(";","&;");//字符转义
buffer.append(file);
buffer.append(
';');
}
pw.println(buffer.toString());
pw.flush();

}
catch(UnknownHostExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
finally
{
try
{
if(pw!=null)
pw.close();
}
catch(Exceptione){}

try
{
if(socket!=null)
socket.close();
}
catch(IOExceptione){}
}

}
}

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
packagecom.vista.test;

importjava.lang.reflect.Constructor;

/**
*
*
@authorphinecos
*
@since2009-5-6
*
*/
publicclassMain
{

/**
*
@paramargs
*
@throwsClassNotFoundException
*/
publicstaticvoidmain(String[]args)
{
try
{
finalClassmyClass=Class.forName("com.vista.test.MyClass");
finalConstructormyConstructor=myClass.getConstructor(newClass[]{String[].class});
String[]torrents
={"c://1001.torrent","c://1002.torrent"};//种子文件列表
MyClassc1=(MyClass)myConstructor.newInstance(newObject[]{torrents});
System.out.println(c1.toString());
c1.sendMessage();
}
catch(Exceptione)
{
e.printStackTrace();
}

}

}

先启动Azureus,再使用此用例进行测试,结果如下图,这表明这两个种子文件都被解析并开始下载了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值