Azureus 소스 분석 (3)

이어 첫 번째 작업은 피드 파일 감청 서버의 실현 세부 사항을 계속 분석한다.
먼저 그 작업 절차를 간단하게 설명하자면, 우선 서버가 6880 포트에 플러그인 감청을 시작한 다음, 다가오는'피드 파일 목록 열기'요청을 처리하기 위한 수호 라인을 엽니다. 이 서비스 라인에서 고객의 요청을 끊임없이 반복해서 읽고torrent 파일 목록을 분석합니다.만약에 이 때 Azureus의 각 구성 요소가 생성되었다면, Azureus의 핵심 처리 구성 요소가 사용할 수 있음을 설명하고, torrent 파일 목록을 직접 처리하지 않으면, 먼저 torrent 파일 목록을 피드 파일 대기열에 추가하고, 각 구성 요소가 생성된 후에 피드 대기열의 각 피드 파일을 처리합니다.
소스 코드를 보려면 먼저 구성원 변수를 살펴보십시오.

  
  
  
  
  1. private ServerSocket socket;//  
  2.     private int state;//  
  3.     private boolean bContinue;//  
  4.     public static final int STATE_FAULTY = 0;//  
  5.     public static final int STATE_LISTENING = 1;//  
  6.     protected List queued_torrents = new ArrayList();// ,  
  7. protected boolean core_started    = false;//  

구조 함수에서 서버 생성 및 시작 완료:

  
  
  
  
  1. socket = new ServerSocket(688050, InetAddress.getByName("127.0.0.1")); //NOLAR: only bind to localhost  
  2.  
  3. state = STATE_LISTENING;// “ ”  

또한pollForConnections에 Azureus에 생명주기 감청기를 추가하여 모든 구성 요소가 완성되면 이 감청기를 알립니다. 후자는 OpenQueued Torrents 방법을 호출하여 피드 파일 대기열에 줄을 서 있는 피드 파일을 처리하고, 이 방법에는 피드 파일 목록 열기 요청을 처리하는 수호선을 만듭니다.실제 처리 작업은 pollForConnectionsSupport 메서드에서 수행됩니다.

  
  
  
  
  1. public void pollForConnections(final AzureusCore azureus_core )  
  2.    {  
  3.        //  
  4.        azureus_core.addLifecycleListener(new AzureusCoreLifecycleAdapter()  
  5.        {  
  6.            //  
  7.            public void componentCreated(AzureusCore core, AzureusCoreComponent    component)   
  8.            {  
  9.                if ( component instanceof UIFunctionsSWT )  
  10.                {  
  11.                    openQueuedTorrents( azureus_core );//  
  12.                }  
  13.            }  
  14.        });  
  15.          
  16.        if ( socket != null )  
  17.        {//  
  18.            Thread t = new AEThread("Start Server")  
  19.            {  
  20.                //runSupport abstract , run ,  
  21.                public void runSupport()  
  22.                {  
  23.                    pollForConnectionsSupport( azureus_core );  
  24.                }  
  25.            };  
  26.            t.setDaemon(true);  
  27.            t.start(); //  
  28.        }  
  29.    } 

이곳의 라인의 중단은 운행 표지판을 설치하는 방식을 채택한다. 나는 이것이 결코 좋은 해결 방안이 아니라고 생각한다. 만약에 라인이 완성해야 할 작업이 매우 오래 걸리면 라인의 중단은 즉각 효과를 볼 수 없기 때문이다.더 좋은 방법은 인터럽트 방법과 인터럽트 로고를 혼합해서 사용하는 것이다.

  
  
  
  
  1. private void pollForConnectionsSupport(AzureusCore azureus_core)   
  2.   {  
  3.       bContinue = true;  
  4.       while (bContinue)   
  5.       {  
  6.           BufferedReader br = null;  
  7.           try   
  8.           {  
  9.               Socket sck = socket.accept();//  
  10.               String address = sck.getInetAddress().getHostAddress(); // IP  
  11.               if (address.equals("localhost") || address.equals("127.0.0.1"))   
  12.               {  
  13.                   br = new BufferedReader(new InputStreamReader(sck.getInputStream(),Constants.DEFAULT_ENCODING));  
  14.                   String line = br.readLine();//             
  15.                   if (Logger.isEnabled())  
  16.                         Logger.log(new LogEvent(LOGID, "Main::startServer: received '"+ line + "'"));  
  17.                   if (line != null)  
  18.                   {  
  19.                       String [] args = parseArgs(line);//  
  20.                       if (args != null && args.length > 0)   
  21.                       {  
  22.                           String debug_str = args[0];// ,  
  23.                           for (int i=1; i<args.length; i++)   
  24.                           {  
  25.                               debug_str += " ; " + args[i];  
  26.                           }  
  27.                           Logger.log(new LogEvent(LOGID, "Main::startServer: decoded to '" + debug_str + "'"));  
  28.                           processArgs(azureus_core,args); //  
  29.  
  30.                       }  
  31.                   }  
  32.               }  
  33.               sck.close();  
  34.           }  
  35.           catch (Exception e)   
  36.           {  
  37.               if(!(e instanceof SocketException))  
  38.                   Debug.printStackTrace( e );        
  39.           }  
  40.           finally   
  41.           {  
  42.               try   
  43.               {  
  44.                   if (br != null)  
  45.                       br.close();  
  46.               } catch (Exception e) { /*ignore */}  
  47.           }  
  48.       }  
  49.   } 

피드 파일 목록이 성공적으로 해석된 후에 처리는 상황에 따라 고려해야 하며, 처리 핵심이 시작되지 않으면 피드 대기열에 넣고 줄을 서서 기다려야 한다. 그렇지 않으면 직접 처리한다.
 

  
  
  
  
  1. try   
  2.         {  
  3.             this_mon.enter();  
  4.  
  5.             if (!core_started)   
  6.             {// ,  
  7.                 queued_torrents.add( new Object[]{ file_name, new Boolean( open )});//  
  8.                 queued = true;  
  9.             }  
  10.         }  
  11.         finally   
  12.         {  
  13.           this_mon.exit();  
  14.         }  
  15.         if ( !queued )  
  16.         {// ,  
  17.             handleFile( azureus_core, file_name, open );  
  18.         } 

구체적인 처리 작업은handleFile에 의해 이루어집니다. 그 중에서 오픈 토런트 방법을 사용하여 피드 파일을 열었습니다. 구체적인 피드 파일 해석은 두 번째 문장을 보십시오.

  
  
  
  
  1. protected void handleFile(AzureusCore    azureus_core,String file_name,boolean open )  
  2. {//  
  3.     try   
  4.     {  
  5.         if ( open )  
  6.         {  
  7.             TorrentOpener.openTorrent(file_name);//  
  8.               
  9.         }  
  10.         else 
  11.         {  
  12.             File    f = new File( file_name );  
  13.             if ( f.isDirectory())  
  14.             {  
  15.                 ShareUtils.shareDir( azureus_core, file_name );  
  16.                   
  17.             }  
  18.             else 
  19.             {  
  20.                ShareUtils.shareFile( azureus_core, file_name );                       
  21.             }  
  22.         }  
  23.     }   
  24.     catch (Throwable e)  
  25.     {  
  26.       Debug.printStackTrace(e);  
  27.     }  

Azureus 생명주기가 각 구성 요소가 생성되면 감청자에게 통지하여 OpenQueued Torrents 방법을 호출하여 줄을 서 있는 피드 파일을 처리합니다

  
  
  
  
  1. protected void openQueuedTorrents(AzureusCore azureus_core )  
  2.   {  
  3.       try 
  4.       {  
  5.           this_mon.enter();  
  6.           core_started    = true;// !  
  7.       }  
  8.       finally 
  9.       {  
  10.           this_mon.exit();  
  11.       }  
  12.            
  13.       //  
  14.       for (int i=0;i<queued_torrents.size();i++)  
  15.       {  
  16.           Object[]    entry = (Object[])queued_torrents.get(i);  
  17.           String    file_name     = (String)entry[0];//  
  18.           boolean    open        = ((Boolean)entry[1]).booleanValue();//  
  19.           handleFile( azureus_core, file_name, open );  
  20.       }  
  21.   } 

좋은 웹페이지 즐겨찾기