Azureus源码剖析(一)

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

代码如下:

             final  Class startupClass  =  Class.forName( " org.gudy.azureus2.ui.swt.Main " );

            
final  Constructor constructor  =  startupClass.getConstructor( new  Class[] {
                String[].
class
            });
            
            constructor.newInstance(
new  Object[] {
                args
            });

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

StartServer startServer

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

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

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

package  com.vista.test;

import  java.io.IOException;
import  java.io.OutputStreamWriter;
import  java.io.PrintWriter;
import  java.net.Socket;
import  java.net.UnknownHostException;

/**
 * 
 * 
@author  phinecos
 * 
@since  2009-5-6
 *
 
*/
public   class  MyClass
{
    
private  String[] files  =   null ;
    
public  MyClass(String[] files)
    {
        
this .files  =  files;
    }
    @Override
    
public  String toString() 
    {
        StringBuilder sb 
=   new  StringBuilder();
        
for  (String file: files)
        {
            sb.append(file);
        }
        
return  sb.toString();
    }
    
public   void  sendMessage()
    {
        Socket socket 
=   null ;
        PrintWriter pw 
=   null ;
        String msg 
=   " StartSocket: passing startup args to already-running Azureus java process listening on [127.0.0.1: 6880] " ;
        String IpAddr 
=   " 127.0.0.1 " ;
        
int  port  =   6880 ;
        
final  String ACCESS_STRING  =   " Azureus Start Server Access " ;
        
        
try  
        {
            socket 
=   new  Socket(IpAddr,port);
            pw 
=   new  PrintWriter( new  OutputStreamWriter(socket.getOutputStream(), " UTF8 " ));
            StringBuffer buffer 
=   new  StringBuffer(ACCESS_STRING  +   " ;args; " );
            
            
for  ( int  i  =   0 ; i  <  files.length;  ++ i)
            {
                String file 
=  files[i].replaceAll( " & " , " && " ).replaceAll( " ; " , " &; " ); // 字符转义
                buffer.append(file);
                buffer.append(
' ; ' );
            }
            pw.println(buffer.toString());
            pw.flush();

        } 
        
catch  (UnknownHostException e)
        {
            
//  TODO Auto-generated catch block
            e.printStackTrace();
        } 
        
catch  (IOException e) {
            
//  TODO Auto-generated catch block
            e.printStackTrace();
        }
        
finally
        {
            
try
            {
                
if  (pw  !=   null )
                    pw.close();
            }
            
catch (Exception e){}
            
            
try  
            {
                
if  (socket  !=   null )
                    socket.close();
            } 
            
catch  (IOException e) {}
        }
        
    }
}

 


package  com.vista.test;

import  java.lang.reflect.Constructor;

/**
 * 
 * 
@author  phinecos
 * 
@since  2009-5-6
 *
 
*/
public   class  Main 
{

    
/**
     * 
@param  args
     * 
@throws  ClassNotFoundException 
     
*/
    
public   static   void  main(String[] args)
    {
        
try  
        {
            
final  Class myClass  =  Class.forName( " com.vista.test.MyClass " );
            
final  Constructor myConstructor  =  myClass.getConstructor( new  Class[]{String[]. class });
            String[] torrents 
=  { " c://1001.torrent " " c://1002.torrent " }; // 种子文件列表
            MyClass c1  =  (MyClass)myConstructor.newInstance( new  Object[]{torrents});
            System.out.println(c1.toString());
            c1.sendMessage();
        } 
        
catch  (Exception e) 
        {
            e.printStackTrace();
        }

    }

}

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值