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

代码如下:

 
  
  1. final Class startupClass = Class.forName("org.gudy.azureus2.ui.swt.Main");  
  2.  
  3. final Constructor constructor = startupClass.getConstructor(new Class[] {  
  4.     String[].class 
  5. });  
  6.  
  7. constructor.newInstance(new Object[] {  
  8.     args  
  9. }); 

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

 
  
  1. StartServer startServer 

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

 
  
  1. socket = new ServerSocket(688050, InetAddress.getByName("127.0.0.1")); //种子文件监听服务器  
  2.       
  3.     state = STATE_LISTENING; //服务器状态设置为“监听中”    

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

 
  
  1. package com.vista.test;  
  2.  
  3. import java.io.IOException;  
  4. import java.io.OutputStreamWriter;  
  5. import java.io.PrintWriter;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8.  
  9. /**  
  10.  *   
  11.  * @author phinecos  
  12.  * @since 2009-5-6  
  13.  *  
  14.  */ 
  15. public class MyClass  
  16. {  
  17.     private String[] files = null;  
  18.     public MyClass(String[] files)  
  19.     {  
  20.         this.files = files;  
  21.     }  
  22.     @Override 
  23.     public String toString()   
  24.     {  
  25.         StringBuilder sb = new StringBuilder();  
  26.         for (String file: files)  
  27.         {  
  28.             sb.append(file);  
  29.         }  
  30.         return sb.toString();  
  31.     }  
  32.     public void sendMessage()  
  33.     {  
  34.         Socket socket = null;  
  35.         PrintWriter pw = null;  
  36.         String msg = "StartSocket: passing startup args to already-running Azureus java process listening on [127.0.0.1: 6880]";  
  37.         String IpAddr = "127.0.0.1";  
  38.         int port = 6880;  
  39.         final String ACCESS_STRING = "Azureus Start Server Access";  
  40.           
  41.         try   
  42.         {  
  43.             socket = new Socket(IpAddr,port);  
  44.             pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF8"));  
  45.             StringBuffer buffer = new StringBuffer(ACCESS_STRING + ";args;");  
  46.               
  47.             for (int i = 0; i < files.length; ++i)  
  48.             {  
  49.                 String file = files[i].replaceAll("&","&&").replaceAll(";","&;");//字符转义  
  50.                 buffer.append(file);  
  51.                 buffer.append(';');  
  52.             }  
  53.             pw.println(buffer.toString());  
  54.             pw.flush();  
  55.  
  56.         }   
  57.         catch (UnknownHostException e)  
  58.         {  
  59.             // TODO Auto-generated catch block  
  60.             e.printStackTrace();  
  61.         }   
  62.         catch (IOException e) {  
  63.             // TODO Auto-generated catch block  
  64.             e.printStackTrace();  
  65.         }  
  66.         finally 
  67.         {  
  68.             try 
  69.             {  
  70.                 if (pw != null)  
  71.                     pw.close();  
  72.             }  
  73.             catch(Exception e){}  
  74.               
  75.             try   
  76.             {  
  77.                 if (socket != null)  
  78.                     socket.close();  
  79.             }   
  80.             catch (IOException e) {}  
  81.         }  
  82.           
  83.     }  

 

 
  
  1.  
  2. package com.vista.test;  
  3.  
  4. import java.lang.reflect.Constructor;  
  5.  
  6. /**  
  7.  *   
  8.  * @author phinecos  
  9.  * @since 2009-5-6  
  10.  *  
  11.  */ 
  12. public class Main   
  13. {  
  14.  
  15.     /**  
  16.      * @param args  
  17.      * @throws ClassNotFoundException   
  18.      */ 
  19.     public static void main(String[] args)  
  20.     {  
  21.         try   
  22.         {  
  23.             final Class myClass = Class.forName("com.vista.test.MyClass");  
  24.             final Constructor myConstructor = myClass.getConstructor(new Class[]{String[].class});  
  25.             String[] torrents = {"c:\\1001.torrent""c:\\1002.torrent"};//种子文件列表  
  26.             MyClass c1 = (MyClass)myConstructor.newInstance(new Object[]{torrents});  
  27.             System.out.println(c1.toString());  
  28.             c1.sendMessage();  
  29.         }   
  30.         catch (Exception e)   
  31.         {  
  32.             e.printStackTrace();  
  33.         }  
  34.  
  35.     }  
  36.  

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