Azureus 소스 분석 (3)
먼저 그 작업 절차를 간단하게 설명하자면, 우선 서버가 6880 포트에 플러그인 감청을 시작한 다음, 다가오는'피드 파일 목록 열기'요청을 처리하기 위한 수호 라인을 엽니다. 이 서비스 라인에서 고객의 요청을 끊임없이 반복해서 읽고torrent 파일 목록을 분석합니다.만약에 이 때 Azureus의 각 구성 요소가 생성되었다면, Azureus의 핵심 처리 구성 요소가 사용할 수 있음을 설명하고, torrent 파일 목록을 직접 처리하지 않으면, 먼저 torrent 파일 목록을 피드 파일 대기열에 추가하고, 각 구성 요소가 생성된 후에 피드 대기열의 각 피드 파일을 처리합니다.
소스 코드를 보려면 먼저 구성원 변수를 살펴보십시오.
- private ServerSocket socket;//
- private int state;//
- private boolean bContinue;//
- public static final int STATE_FAULTY = 0;//
- public static final int STATE_LISTENING = 1;//
- protected List queued_torrents = new ArrayList();// ,
- protected boolean core_started = false;//
구조 함수에서 서버 생성 및 시작 완료:
- socket = new ServerSocket(6880, 50, InetAddress.getByName("127.0.0.1")); //NOLAR: only bind to localhost
-
- state = STATE_LISTENING;// “ ”
또한pollForConnections에 Azureus에 생명주기 감청기를 추가하여 모든 구성 요소가 완성되면 이 감청기를 알립니다. 후자는 OpenQueued Torrents 방법을 호출하여 피드 파일 대기열에 줄을 서 있는 피드 파일을 처리하고, 이 방법에는 피드 파일 목록 열기 요청을 처리하는 수호선을 만듭니다.실제 처리 작업은 pollForConnectionsSupport 메서드에서 수행됩니다.
- public void pollForConnections(final AzureusCore azureus_core )
- {
- //
- azureus_core.addLifecycleListener(new AzureusCoreLifecycleAdapter()
- {
- //
- public void componentCreated(AzureusCore core, AzureusCoreComponent component)
- {
- if ( component instanceof UIFunctionsSWT )
- {
- openQueuedTorrents( azureus_core );//
- }
- }
- });
-
- if ( socket != null )
- {//
- Thread t = new AEThread("Start Server")
- {
- //runSupport abstract , run ,
- public void runSupport()
- {
- pollForConnectionsSupport( azureus_core );
- }
- };
- t.setDaemon(true);
- t.start(); //
- }
- }
이곳의 라인의 중단은 운행 표지판을 설치하는 방식을 채택한다. 나는 이것이 결코 좋은 해결 방안이 아니라고 생각한다. 만약에 라인이 완성해야 할 작업이 매우 오래 걸리면 라인의 중단은 즉각 효과를 볼 수 없기 때문이다.더 좋은 방법은 인터럽트 방법과 인터럽트 로고를 혼합해서 사용하는 것이다.
- private void pollForConnectionsSupport(AzureusCore azureus_core)
- {
- bContinue = true;
- while (bContinue)
- {
- BufferedReader br = null;
- try
- {
- Socket sck = socket.accept();//
- String address = sck.getInetAddress().getHostAddress(); // IP
- if (address.equals("localhost") || address.equals("127.0.0.1"))
- {
- br = new BufferedReader(new InputStreamReader(sck.getInputStream(),Constants.DEFAULT_ENCODING));
- String line = br.readLine();//
- if (Logger.isEnabled())
- Logger.log(new LogEvent(LOGID, "Main::startServer: received '"+ line + "'"));
- if (line != null)
- {
- String [] args = parseArgs(line);//
- if (args != null && args.length > 0)
- {
- String debug_str = args[0];// ,
- for (int i=1; i<args.length; i++)
- {
- debug_str += " ; " + args[i];
- }
- Logger.log(new LogEvent(LOGID, "Main::startServer: decoded to '" + debug_str + "'"));
- processArgs(azureus_core,args); //
-
- }
- }
- }
- sck.close();
- }
- catch (Exception e)
- {
- if(!(e instanceof SocketException))
- Debug.printStackTrace( e );
- }
- finally
- {
- try
- {
- if (br != null)
- br.close();
- } catch (Exception e) { /*ignore */}
- }
- }
- }
피드 파일 목록이 성공적으로 해석된 후에 처리는 상황에 따라 고려해야 하며, 처리 핵심이 시작되지 않으면 피드 대기열에 넣고 줄을 서서 기다려야 한다. 그렇지 않으면 직접 처리한다.
- try
- {
- this_mon.enter();
-
- if (!core_started)
- {// ,
- queued_torrents.add( new Object[]{ file_name, new Boolean( open )});//
- queued = true;
- }
- }
- finally
- {
- this_mon.exit();
- }
- if ( !queued )
- {// ,
- handleFile( azureus_core, file_name, open );
- }
구체적인 처리 작업은handleFile에 의해 이루어집니다. 그 중에서 오픈 토런트 방법을 사용하여 피드 파일을 열었습니다. 구체적인 피드 파일 해석은 두 번째 문장을 보십시오.
- protected void handleFile(AzureusCore azureus_core,String file_name,boolean open )
- {//
- try
- {
- if ( open )
- {
- TorrentOpener.openTorrent(file_name);//
-
- }
- else
- {
- File f = new File( file_name );
- if ( f.isDirectory())
- {
- ShareUtils.shareDir( azureus_core, file_name );
-
- }
- else
- {
- ShareUtils.shareFile( azureus_core, file_name );
- }
- }
- }
- catch (Throwable e)
- {
- Debug.printStackTrace(e);
- }
- }
Azureus 생명주기가 각 구성 요소가 생성되면 감청자에게 통지하여 OpenQueued Torrents 방법을 호출하여 줄을 서 있는 피드 파일을 처리합니다
- protected void openQueuedTorrents(AzureusCore azureus_core )
- {
- try
- {
- this_mon.enter();
- core_started = true;// !
- }
- finally
- {
- this_mon.exit();
- }
-
- //
- for (int i=0;i<queued_torrents.size();i++)
- {
- Object[] entry = (Object[])queued_torrents.get(i);
- String file_name = (String)entry[0];//
- boolean open = ((Boolean)entry[1]).booleanValue();//
- handleFile( azureus_core, file_name, open );
- }
- }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Asp와 XML로 상호작용하는 실례 원본XML은 표준 확장 언어로 미래 웹 프로그래밍의 표준이다. asp는 현재 널리 전해지는 웹 프로그래밍 언어 중의 하나이다. 그들 두 사람이 연합하여 역할을 발휘할 수 있을까?두부는 여기서 여러분에게 아주 간단한 As...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.