私はネットの周りの膨大な数のウェブページを読む必要があります。これは、リモートWebページを取得するために実際に使用している方法です。現在のコードは100%機能していることに注意してください。
static private GetWebPageResult getWebPage(PageNode pagenode)
{
String result;
String inputLine;
URI url;
int cicliLettura=0;
long startTime=0, endTime, openConnTime=0,connTime=0, readTime=0;
try
{
startTime=System.nanoTime();
result="";
url=pagenode.getUri(); //fare qualcosa se getURI è null
if(Core.logGetWebPage())
openConnTime=System.nanoTime();
if(url!=null)
{
HttpURLConnection yc = (HttpURLConnection) url.toURL().openConnection(); //controllare yc
if(url.toURL().getProtocol().equalsIgnoreCase("https"))
yc=(HttpsURLConnection)yc;
yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)");
yc.connect(); //controllare il risultato di .connect => non c'è! al max lancia IOEXC
if(checkResponseCode(yc.getResponseCode())==false)
return new GetWebPageResult(GetWebPageResult.ERR_BAD_RESPONSE_CODE,yc.getResponseCode());
if(Core.logGetWebPage())
connTime=System.nanoTime();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));//può lanciare IOEXC
/*
while ((inputLine = in.readLine()) != null)
{
result=result+inputLine+"\n";
cicliLettura++;
}*/
StringBuffer buffer = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
buffer.append(inputLine).append('\n');
cicliLettura++;
}
result = buffer.toString();
if(Core.logGetWebPage())
readTime=System.nanoTime();
in.close();
yc.disconnect();
if(Core.logGetWebPage())
{
endTime=System.nanoTime();
//url.toURL() non è null, controllato prima
System.out.println(/*result+*/"getWebPage eseguito in "+(endTime-startTime)/1000000+" ms. Size: "+result.length()+" Response Code="+yc.getResponseCode()+" Protocollo="+url.toURL().getProtocol()+" openConnTime: "+(openConnTime-startTime)/1000000+" connTime:"+(connTime-openConnTime)/1000000+" readTime:"+(readTime-connTime)/1000000+" cicliLettura="+cicliLettura+" pagina:"+url.toURL());
}
return new GetWebPageResult(result);
}
else
return new GetWebPageResult(GetWebPageResult.ERR_NULL_URI,-2);
}catch(IOException e){
System.out.println("Eccezione1: "+e.toString());
e.printStackTrace();
return new GetWebPageResult(GetWebPageResult.ERR_HTML_IOEXCEPTION,-2);
}catch(ClassCastException e){
System.out.println("Eccezione2: "+e.toString());
e.printStackTrace();
return new GetWebPageResult(GetWebPageResult.ERR_CLASS_CAST_EXC,-2);
}catch(Exception e){
System.out.println("Eccezione ERR_NOT_LISTED_EXC: "+e.toString());
return new GetWebPageResult(GetWebPageResult.ERR_NOT_LISTED_EXC,-2);
}
}
URLがnullでない場合は、コードを詳しく見てみましょう。
HttpURLConnection yc = (HttpURLConnection) url.toURL().openConnection(); //controllare yc
if(url.toURL().getProtocol().equalsIgnoreCase("https"))
yc=(HttpsURLConnection)yc;
yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)");
yc.connect(); //controllare il risultato di .connect => non c'è! al max lancia IOEXC
if(checkResponseCode(yc.getResponseCode())==false)
return new GetWebPageResult(GetWebPageResult.ERR_BAD_RESPONSE_CODE,yc.getResponseCode());
.openConnectionメソッドと.connectメソッドの違いは何ですか?とにかく、接続を開くと、データの読み取りを開始します
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));//può lanciare IOEXC
StringBuffer buffer = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
buffer.append(inputLine).append('\n');
cicliLettura++;
}
result = buffer.toString();
さて、今私はデータを読み取るBufferedReaderを持っています。問題は、私の帯域幅がリモートマシンの帯域幅よりもはるかに大きいことが非常に多いため、「同時に」さまざまなソースから読み取ることができるようにしたいということです。良い方法は、多くのスレッドを起動し、このようにコードの最後の部分を変更するようです
ファイルの終わりではありませんが、読むべき完全な行はありますか?はいの場合は、新しい行を要求します。そうでない場合は、少し眠ります。この時点で、私は次の読書スレッドに進み、同じことをします。それが正しいか?これを実装する方法は?
これは、古典的な生産者/消費者シナリオのように見えます。次のクラスを作成することで、アプリケーションを最適化できます。BlockingQueueの概念と生産者/消費者問題をまだ認識していない場合は、私の回答/設計に進む前にこれを読むことをお勧めします。
ここで行う必要があるのは、PageNodeオブジェクトをProcessingQueueに追加し、WebPageReaderスレッドとWebPageProcessorスレッドを開始して、魔法が起こるのを監視することだけです。説明が必要な場合はお知らせください。要件に応じて、1つのWebPageReaderスレッドとWebPageProcessorスレッドのみまたは複数のスレッドを開始することを選択できます。デザインは両方をサポートします。また、Webをクロールするか、クロールするページについて何らかのデータベースをポーリングすることにより、PageNodeオブジェクトをProcessingQueueに追加するためのスレッドをもう1つ導入できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加