![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ホームページを見たり、メールチェックをしたり、数分間このプログラムを走らせると、
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());}
}
}
No.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());}
}
}
No.4
- 回答日時:
>また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか?
このプログラムでは、3000コネクションを「続けて」ではなく、「同時に」接続するようになってます。
(ただし、接続開始は0.1づつずれています)
mainメソッドのループの中で、スレッドが起動されているからです。
意図的だとしたら、やはり常識はずれというしかないと思いますね。
スレッドの意味を知らずにやったのだとしたら、スレッドを調べてください。
回答いただきありがとうございます。
ご指摘ありがとうございます。では、どのように改良すれば、効率よくサイトを分析することができますか?
それとも、これをするのは、非常に高度で難しいことのなのでしょうか?
宜しくお願い致します。
No.3
- 回答日時:
プログラムの是非の議論は別にして、
3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか?
ちょっとしたサイト攻撃ですw
Connection refused: connect(接続排除)ですね(^^;)
たぶん、やりたいことを予想するに、
helloURL = "http://shopping.yahoo.co.jp/";
Th th1 = new Th(helloURL);
の場所がforループの外になければいけません。
回答頂ありがとうございます。
できるだけ早く、ソース情報を更新して解析をしたいのですがうまくいっていません。
>3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか?
ちょっとしたサイト攻撃ですw
ヤフーくらいなら、0.1秒でも問題ないかと思うのですがいかがでしょうか?google.comやヤフーであれば、全国からミリ単位ですごいアクセスがあると思うのですが・・・
また、たくさんアクセスした程度でサーバーは故障するほど脆弱なのでしょうか?私のPCで無限ループのプログラムを作ったりとか、かなりひどいことをしていますが、プログラムは止まっても、同時に使っているIEやOE、当然ハードにも全く影響がありません。
また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか?
具体的に、何秒にすればよいかというのもありませんし、エラーが出にくくはなるのですが、その内エラーが出てしまいます。
若しくは、自分でこのコネクションを閉じることができれば言い訳ですよね?ただ、そのやり方がわかりません。
いかがすればよいでしょうか・・・
まったくもって分かりません。宜しくお願い致します。
No.2
- 回答日時:
そうですね。
ではまず、「何をするためにこのプログラムを作成したか」
もしくは「このコードがどのような動きをするものなのか」を
述べてみて下さい。
正しく述べることができれば
#1さんがどうしてこのような回答をされたのかも
説明可能だと思われます。
この回答への補足
回答頂ありがとうございます。
目的など
0.1秒毎に、ソースファイル更新して、その中から、有力な情報を得ること。
特に、プレス系のサイトから自分専用の重要情報を即時しらせる通知システムを考えています。
また、今は、文字数の関係でヤフーしかありませんが、ここには、5000以上のサイトを入れてスレッドにする予定ですが、うまく動いていません。どうすればうまく動くのでしょうか?
また、たくさんホームページを見たからといってアクセスするのが違法であれば、世界中からアクセスされているgoogleやロボットエンジンのプログラムも違法になりますがいかがでしょうか?
もし、個人で違法になる場合があるとすれば、他人のパスワードを盗んだり、した場合に限られると思うのですがいかがでしょう。
ただ、本題から外れていますが、最終的には、コードを改良して複数サイトから有力な情報を見つけるという目的ですが、特に、Address already in use: connect java
のエラー対処が分からず困っています。
ぜひとも、宜しくお願い致します。
No.1
- 回答日時:
当たり前です。
というか、このコードの意味するところが理解できていますか?
理解できているなら非常に悪質でかつ、非常識であることをを恥じるべきです。
技術的云々より、常識を学びましょう。
ヤフーのような管理に疑問符がつくようなサイトであるから何も言われないかもしれませんが、普通のサイトであれば訴えられます。
回答頂ありがとうございます。
なぜ、訴えられるのか全くわかりません。ホームページにアクセスしてはいけないという法律があるのでしょうか?
本論にもどりますが、適切なスピードでアクセスするにはどうすべきかというところが問題です。多分、高速にアクセスするため、通信のエラーが発生するようです。そのためには、どうすればよいのでしょうか?
特に、Address already in use: connect java
のえらー対処が分かりません。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値を使用する呼出
-
Java int sum = 0は必要ですか?
-
テキストファイルから空白行をよむ
-
以下のJAVAプログラムでご質問...
-
「javaに関して」エラーが解決...
-
javaのfor文が機能してないみた...
-
CSVファイルを列ごとに読み込む...
-
equalsの逆
-
yyyymmddからyyyy/mm/d...
-
Inputstreamについて
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
EXCEL VBA で、0から?1から?
-
JSPやサーブレットでSystem.out...
-
ActionForm form にnullが入っ...
-
Java配列でNullPointerExceptio...
-
オブジェクトの中のプロパティ...
-
パソコンキーボードで時分秒を...
-
大量のデータを読み込んで表示...
-
数字文字列をパック10進数に変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
InputStream.read()でタイムア...
-
Java int sum = 0は必要ですか?
-
テキストファイルから空白行をよむ
-
csv出力について
-
[JAVA]エラーが解決できません。
-
Servletでテキストボックスに入...
-
Javaの質問です。テキストファ...
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
javaのfor文が機能してないみた...
-
java連結
-
ObjectInputStreamとStreamCorr...
-
テキストファイルにおいて任意...
-
Class.forNameでエラーになる
-
九九を横に表示する。
-
Javaの質問です。テキストファ...
-
javaでCSVの中身から最大値を表...
-
BufferedReaderでのエラー
おすすめ情報