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();
        }

    }

}
复制代码


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/05/06/1450909.html,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
API
muduo源码剖析之SocketOps类
对socket设置API的封装。比较简单,已经编写注释。
52 0
|
监控 Java
java多线程入门(六)Disruptor使用
java多线程入门(六)Disruptor使用
893 0
|
5月前
|
Java
【多线程面试题十六】、谈谈ReentrantLock的实现原理
这篇文章解释了`ReentrantLock`的实现原理,它基于Java中的`AbstractQueuedSynchronizer`(AQS)构建,通过重写AQS的`tryAcquire`和`tryRelease`方法来实现锁的获取与释放,并详细描述了AQS内部的同步队列和条件队列以及独占模式的工作原理。
【多线程面试题十六】、谈谈ReentrantLock的实现原理
|
5月前
|
Java 调度
【多线程面试题十四】、说一说synchronized的底层实现原理
这篇文章解释了Java中的`synchronized`关键字的底层实现原理,包括它在代码块和方法同步中的实现方式,以及通过`monitorenter`和`monitorexit`指令以及`ACC_SYNCHRONIZED`访问标志来控制线程同步和锁的获取与释放。
|
7月前
|
API 调度
协程源码剖析(二)
协程源码剖析(二)
40 1
|
7月前
|
调度
协程源码剖析(一)
协程源码剖析(一)
45 0
|
8月前
|
安全 C++ 容器
muduo源码剖析之TimerQueue类
通过timerfd实现的定时器功能,为EventLoop扩展了一系列runAt,runEvery,runEvery等函数TimerQueue中通过std::set维护所有的Timer,也可以使用优先队列实现muduo的TimerQueue是基于timerfd_create实现,这样超时很容易和epoll结合起来。等待超时事件保存在set集合中,注意set集合的有序性,从小到大排列,整个对TimerQueue的处理也就是对set集合的操作。
58 0
muduo源码剖析之TimerQueue类
|
8月前
muduo源码剖析之EventLoopThread
EventLoopThread类包装了一个thread类和一个EventLoop类,(one loop per thread)是封装了一个EventLoop的独立线程。
69 0
|
8月前
|
Java
muduo源码剖析之EventLoopThreadPool
EventLoopThreadPool是EventLoopThread类的线程池类封装了若干个EventLoopThread的线程池,所有者是一个外部的EventLoop。
51 0
|
SQL 安全 Java
JUC并发编程学习(十八) -搞懂单例模式
JUC并发编程学习(十八) -搞懂单例模式
JUC并发编程学习(十八) -搞懂单例模式