整个项目运行的起点在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
});
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;//服务器状态设置为“监听中”
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){}
}
}
}
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();
}
}
}
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,再使用此用例进行测试,结果如下图,这表明这两个种子文件都被解析并开始下载了。
1995

被折叠的 条评论
为什么被折叠?



