電子書籍の厳選無料作品が豊富!

ホームページを見たり、メールチェックをしたり、数分間このプログラムを走らせると、
Address already in use: connect java

Connection refused: connect
といったエラーメッセージが出ます。
どうすれば、解決するでしょうか?
やさしいJAVAやインターネットで調べたのですが良い方法が分かりません。ぜひ、ご教示宜しくお願い致します。

import java.net.*;
import java.io.*;
import java.util.*;
import java.text.*;

class Test {
public static void main(String[] args) throws Exception {
String helloURL;
for(int a=1; a<3000; a++) {

helloURL = "http://shopping.yahoo.co.jp/";
Th th1 = new Th(helloURL);
th1.start();
Thread.sleep(100);
}
}
}

class Th extends Thread {
String helloURL = null;
String line;
Th(String str) {
this.helloURL = str;
}
public void run() {
try {
URL url = new URL(helloURL);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect"));
while ((line = in.readLine()) != null) {
try {
OutputStream os = new FileOutputStream("log.txt",true);
BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os));
if(line.indexOf("ヤフー") != -1) {
fr.write(line);
}
if(line.indexOf("あ") != -1) {
fr.write(line);
}
fr.close();
os.close();
} catch(Exception e){System.out.println("エラー1 : "+e.getMessage());}
}
in.close();
} catch(Exception ex){System.out.println("エラー2 : "+ex.getMessage());}
}
}

A 回答 (5件)

スレッドは基本的にrun()メソッドの中でループを書くので(思い込みだったらすみませんw)、こんな感じですかねぇ?



class Test {
 public static void main(String[] args) {
  //各URLにつき1つスレッドオブジェクトを作成
  Th th1 = new Th() ;
  th1.start() ;
 }
}

class Th extends Thread {
 ~中略~
 public void run() {
  //出力ストリーム作成

  //ここでループ
  while(終了条件) {
   //入力ストリーム作成
   //処理
   //入力ストリーム閉じる
   sleep( 100 ) ;
  }
  //出力ストリーム閉じる
 }
}

こうすれば1つのサイトにつき1つのオブジェクト、と1つのコネクションだけでいいですよね。

参考URL:http://www.hellohiro.com/thread.htm

この回答への補足

回答頂ありがとうございます。
これで、同時に多量のコネクションを開かなくて良いことになったようです。おかげで、コネクションの拒否エラーはなくなりました!ありがとうございます。
しかし、次は、
【Address already in use: connect】
といったエラーがたまにですが発生します。また、発生し始めると連続的に発生してソースデータを読み取っていないようです。どうすれば、バグを取り除くことができるかわかりますでしょうか?また、このバグを取るための参考になる書籍やHPなどありましたら宜しくお願い致します。

import java.net.*;
import java.io.*;
import java.util.*;
import java.text.*;

class Test {
public static void main(String[] args) throws Exception {
String helloURL;
helloURL = "http://shopping.yahoo.co.jp/";
Th th1 = new Th(helloURL);
th1.start();

helloURL = "http://www.yahoo.co.jp/";
Th th2 = new Th(helloURL);
th2.start();

helloURL = "http://www.yahoo.co.jp/r/tt";
Th th3 = new Th(helloURL);
th3.start();

helloURL = "http://www.yahoo.co.jp/r/tr";
Th th4 = new Th(helloURL);
th4.start();

helloURL = "http://www.yahoo.co.jp/r/bi";
Th th5 = new Th(helloURL);
th5.start();

helloURL = "http://www.yahoo.co.jp/r/lo";
Th th6 = new Th(helloURL);
th6.start();

helloURL = "http://www.yahoo.co.jp/r/pa1";
Th th7 = new Th(helloURL);
th7.start();

helloURL = "http://www.yahoo.co.jp/r/he";
Th th8 = new Th(helloURL);
th8.start();

helloURL = "http://www.yahoo.co.jp/r/we";
Th th9 = new Th(helloURL);
th9.start();

helloURL = "http://www.yahoo.co.jp/r/sp";
Th th10 = new Th(helloURL);
th10.start();

helloURL = "http://www.yahoo.co.jp/r/qu";
Th th11 = new Th(helloURL);
th11.start();

helloURL = "http://www.yahoo.co.jp/r/mo";
Th th12 = new Th(helloURL);
th12.start();

helloURL = "http://www.yahoo.co.jp/r/mu";
Th th13 = new Th(helloURL);
th13.start();

}
}

class Th extends Thread {
String helloURL = null;
String line;
Th(String str) {
this.helloURL = str;
}
public void run() {
try {
OutputStream os = new FileOutputStream("log.txt",true);
BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os));
int a = 1;
while(a<=1000) {
URL url = new URL(helloURL);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"EUC-JP"));
a++;
while ((line = in.readLine()) != null) {
// System.out.println(line);
if(line.indexOf("キャンペーン") != -1) {
System.out.println(helloURL+"\n"+"キャンペーン開始");
fr.write(helloURL+"\n"+"キャンペーン開始");
}
}
in.close();
}
fr.close();
os.close();
} catch(Exception ex){System.out.println(ex.getMessage());}
}
}

補足日時:2004/10/16 13:17
    • good
    • 0

>また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか?




このプログラムでは、3000コネクションを「続けて」ではなく、「同時に」接続するようになってます。
(ただし、接続開始は0.1づつずれています)

mainメソッドのループの中で、スレッドが起動されているからです。

意図的だとしたら、やはり常識はずれというしかないと思いますね。

スレッドの意味を知らずにやったのだとしたら、スレッドを調べてください。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
ご指摘ありがとうございます。では、どのように改良すれば、効率よくサイトを分析することができますか?
それとも、これをするのは、非常に高度で難しいことのなのでしょうか?
宜しくお願い致します。

お礼日時:2004/10/13 13:40

プログラムの是非の議論は別にして、



3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか?
ちょっとしたサイト攻撃ですw

Connection refused: connect(接続排除)ですね(^^;)

たぶん、やりたいことを予想するに、
helloURL = "http://shopping.yahoo.co.jp/";
Th th1 = new Th(helloURL);
の場所がforループの外になければいけません。
    • good
    • 0
この回答へのお礼

回答頂ありがとうございます。
できるだけ早く、ソース情報を更新して解析をしたいのですがうまくいっていません。

>3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか?
ちょっとしたサイト攻撃ですw

ヤフーくらいなら、0.1秒でも問題ないかと思うのですがいかがでしょうか?google.comやヤフーであれば、全国からミリ単位ですごいアクセスがあると思うのですが・・・
また、たくさんアクセスした程度でサーバーは故障するほど脆弱なのでしょうか?私のPCで無限ループのプログラムを作ったりとか、かなりひどいことをしていますが、プログラムは止まっても、同時に使っているIEやOE、当然ハードにも全く影響がありません。

また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか?
具体的に、何秒にすればよいかというのもありませんし、エラーが出にくくはなるのですが、その内エラーが出てしまいます。

若しくは、自分でこのコネクションを閉じることができれば言い訳ですよね?ただ、そのやり方がわかりません。
いかがすればよいでしょうか・・・

まったくもって分かりません。宜しくお願い致します。

お礼日時:2004/10/12 22:27

そうですね。



ではまず、「何をするためにこのプログラムを作成したか」
もしくは「このコードがどのような動きをするものなのか」を
述べてみて下さい。

正しく述べることができれば
#1さんがどうしてこのような回答をされたのかも
説明可能だと思われます。

この回答への補足

回答頂ありがとうございます。

目的など
0.1秒毎に、ソースファイル更新して、その中から、有力な情報を得ること。
特に、プレス系のサイトから自分専用の重要情報を即時しらせる通知システムを考えています。
また、今は、文字数の関係でヤフーしかありませんが、ここには、5000以上のサイトを入れてスレッドにする予定ですが、うまく動いていません。どうすればうまく動くのでしょうか?
また、たくさんホームページを見たからといってアクセスするのが違法であれば、世界中からアクセスされているgoogleやロボットエンジンのプログラムも違法になりますがいかがでしょうか?
もし、個人で違法になる場合があるとすれば、他人のパスワードを盗んだり、した場合に限られると思うのですがいかがでしょう。

ただ、本題から外れていますが、最終的には、コードを改良して複数サイトから有力な情報を見つけるという目的ですが、特に、Address already in use: connect java
のエラー対処が分からず困っています。
ぜひとも、宜しくお願い致します。

補足日時:2004/10/12 22:08
    • good
    • 0

当たり前です。


というか、このコードの意味するところが理解できていますか?
理解できているなら非常に悪質でかつ、非常識であることをを恥じるべきです。

技術的云々より、常識を学びましょう。
ヤフーのような管理に疑問符がつくようなサイトであるから何も言われないかもしれませんが、普通のサイトであれば訴えられます。
    • good
    • 0
この回答へのお礼

回答頂ありがとうございます。
なぜ、訴えられるのか全くわかりません。ホームページにアクセスしてはいけないという法律があるのでしょうか?
本論にもどりますが、適切なスピードでアクセスするにはどうすべきかというところが問題です。多分、高速にアクセスするため、通信のエラーが発生するようです。そのためには、どうすればよいのでしょうか?

特に、Address already in use: connect java
のえらー対処が分かりません。
宜しくお願い致します。

お礼日時:2004/10/12 18:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!