• ベストアンサー

「プログラミング」JAVAのエラーが解決できません。

ホームページを見たり、メールチェックをしたり、数分間このプログラムを走らせると、 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());} } }

  • Java
  • 回答数5
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sakyo-t
  • ベストアンサー率70% (19/27)
回答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
mizuki_ff
質問者

補足

回答頂ありがとうございます。 これで、同時に多量のコネクションを開かなくて良いことになったようです。おかげで、コネクションの拒否エラーはなくなりました!ありがとうございます。 しかし、次は、 【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());} } }

その他の回答 (4)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

>また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか? このプログラムでは、3000コネクションを「続けて」ではなく、「同時に」接続するようになってます。 (ただし、接続開始は0.1づつずれています) mainメソッドのループの中で、スレッドが起動されているからです。 意図的だとしたら、やはり常識はずれというしかないと思いますね。 スレッドの意味を知らずにやったのだとしたら、スレッドを調べてください。

mizuki_ff
質問者

お礼

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

  • sakyo-t
  • ベストアンサー率70% (19/27)
回答No.3

プログラムの是非の議論は別にして、 3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか? ちょっとしたサイト攻撃ですw Connection refused: connect(接続排除)ですね(^^;) たぶん、やりたいことを予想するに、 helloURL = "http://shopping.yahoo.co.jp/"; Th th1 = new Th(helloURL); の場所がforループの外になければいけません。

mizuki_ff
質問者

お礼

回答頂ありがとうございます。 できるだけ早く、ソース情報を更新して解析をしたいのですがうまくいっていません。 >3000個Threadオブジェクトを作って、3000コネクションをこのサイトにしてるんじゃないですか? ちょっとしたサイト攻撃ですw ヤフーくらいなら、0.1秒でも問題ないかと思うのですがいかがでしょうか?google.comやヤフーであれば、全国からミリ単位ですごいアクセスがあると思うのですが・・・ また、たくさんアクセスした程度でサーバーは故障するほど脆弱なのでしょうか?私のPCで無限ループのプログラムを作ったりとか、かなりひどいことをしていますが、プログラムは止まっても、同時に使っているIEやOE、当然ハードにも全く影響がありません。 また、サイトの数ですが、同時に開くのではなく、3000コネクション同時ではなく開いた端から、どんどん閉じていくと思うのですがいかがでしょうか? 具体的に、何秒にすればよいかというのもありませんし、エラーが出にくくはなるのですが、その内エラーが出てしまいます。 若しくは、自分でこのコネクションを閉じることができれば言い訳ですよね?ただ、そのやり方がわかりません。 いかがすればよいでしょうか・・・ まったくもって分かりません。宜しくお願い致します。

  • hisappy
  • ベストアンサー率46% (184/392)
回答No.2

そうですね。 ではまず、「何をするためにこのプログラムを作成したか」 もしくは「このコードがどのような動きをするものなのか」を 述べてみて下さい。 正しく述べることができれば #1さんがどうしてこのような回答をされたのかも 説明可能だと思われます。

mizuki_ff
質問者

補足

回答頂ありがとうございます。 目的など 0.1秒毎に、ソースファイル更新して、その中から、有力な情報を得ること。 特に、プレス系のサイトから自分専用の重要情報を即時しらせる通知システムを考えています。 また、今は、文字数の関係でヤフーしかありませんが、ここには、5000以上のサイトを入れてスレッドにする予定ですが、うまく動いていません。どうすればうまく動くのでしょうか? また、たくさんホームページを見たからといってアクセスするのが違法であれば、世界中からアクセスされているgoogleやロボットエンジンのプログラムも違法になりますがいかがでしょうか? もし、個人で違法になる場合があるとすれば、他人のパスワードを盗んだり、した場合に限られると思うのですがいかがでしょう。 ただ、本題から外れていますが、最終的には、コードを改良して複数サイトから有力な情報を見つけるという目的ですが、特に、Address already in use: connect java のエラー対処が分からず困っています。 ぜひとも、宜しくお願い致します。

回答No.1

当たり前です。 というか、このコードの意味するところが理解できていますか? 理解できているなら非常に悪質でかつ、非常識であることをを恥じるべきです。 技術的云々より、常識を学びましょう。 ヤフーのような管理に疑問符がつくようなサイトであるから何も言われないかもしれませんが、普通のサイトであれば訴えられます。

mizuki_ff
質問者

お礼

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

関連するQ&A

  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • javaプログラミング

    javaとYahooのWebサービスを利用して、検索結果のxmlを取り出し、 ○○.xmlという引数を与えて、結果を書き出そうとしていますが、 以下のプログラムだと文字(日本語)が化けてしまいます。 どうにかして文字化けせず取り出すことはできないでしょうか。 よろしくおねがいします。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStream; import java.net.URL; public class YahooWebServiceExample { public static void main(String[] args) { String request = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch? appid=web_research&query=%e6%b2%96%e7%b8%84&results=2"; try { // ファイル出力ストリームを取得(第二引数) BufferedWriter bw = new BufferedWriter(new FileWriter(args[0])); URL url = new URL(request); InputStream in = url.openStream(); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { for (int i = 0; i < len; i++) { System.out.print((char) buf[i]); bw.write(buf[i]); } } in.close(); bw.close(); } catch (Exception e) { System.out.println("Web services request failed"); } } }

    • ベストアンサー
    • Java
  • javaのエンコードについて?

    さまざまなホームページを探して、下記のプログラムでホームページの情報は読み取ることができるようになったのですが、文字化けを起こして見ることができません。 何をどうすれば文字化けを防げるのかまったくわかりません。 ご存知の方、おしえていただけないでしょうか? おねがいいたします。 import java.io.*; import java.net.*; class test{ public static void main(String[] args) throws Exception { URL url = null; BufferedReader in = null; String readString = null; url = new URL("http://www.yahoo.co.jp/"); in = new BufferedReader(new InputStreamReader(url.openStream())); while((readString=in.readLine())!=null) System.out.println(readString); in.close(); } }

    • ベストアンサー
    • Java
  • javaのエンコードについて?

    下記のプログラムでホームページの情報は読み取ることができるようになったのですが、一部ホームページ(UTF-8エンコードのホームページと思われる)、文字化けを起こして見ることができません。 解決する方法を、教えていただけないでしょうか? おねがいいたします。 import java.io.*; import java.net.*; class test{ public static void main(String[] args) throws Exception { URL url = null; BufferedReader in = null; String readString = null; url = new URL("http://www.faireal.net/"); in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); while((readString=in.readLine())!=null) System.out.println(readString); in.close(); } }

    • ベストアンサー
    • Java
  • javaでクッキーを取得したい

    以下ソースで、ホームページのデータは取得できるのですが、クッキーが必要なページではうまく作動しません。 どのように改良すればよいでしょうか? また、こういったプログラムを作るのに参考になる書籍をご存知でしたら教えてください。 よろしくお願いいたします。 import java.io.*; import java.net.*; class test { public static void main(String[] args) throws Exception { URL url = null; BufferedReader in = null; String readString = null; url = new URL("http://www.yahoo.co.jp"); in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); while((readString=in.readLine())!=null) System.out.println(readString); in.close(); } }

    • ベストアンサー
    • Java
  • Java での グローバルIP取得

    Java を利用してグローバルIPの取得方法を探しています。 以下のサイトを参考にいたしました。 http://stackoverflow.com/questions/2939218/getting-the-external-ip-address-in-java 文中中ほどの以下のソースを試したのですが「checkip.amazonaws.com」と通信を行うせいか、ワンテンポページ表示に時間がかかります。 JavaでのグローバルIP取得するには他に良い方法はあるのでしょうか? それとも、whatismyipのようなサイトと通信を行わないとできないのでしょうか? よろしくお願い致します。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; public class IpChecker { public static String getIp() throws Exception { URL whatismyip = new URL("http://checkip.amazonaws.com"); BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader( whatismyip.openStream())); String ip = in.readLine(); return ip; } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

  • JAVAで、SSL通信

    現在、Javaで、別のサーバから、sslで、htmlファイルを 取得するプログラムを作成しようとしています。 環境と、プログラムは、以下のようになっております。 皆さんお忙しいと思いますが、なにとぞご教授お願いいたします。 【環境】 OS:Solaris8 WAS:WebSphere5.0 コンパイラ:WebSphere5.0に存在するコンパイラ 【プログラム】 import java.net.*; import java.io.*; import javax.net.ssl.*; public class JSSETEST2 { public static void main(String[] args) { try { URL url = new URL("https://www.kamata.com/"); HttpsURLConnection conection = (HttpsURLConnection)url.openConnection(); PrintWriter out = new PrintWriter( conection.getOutputStream() ); out.close(); BufferedReader in = new BufferedReader( new InputStreamReader( conection.getInputStream() ) ); String line; while( (line = in.readLine() ) != null ){ System.out.println( line ); } in.close(); } catch(Exception e) { e.printStackTrace(); } } } 【実行】 java -Djava.protocol.handler.pkgs=com.ibm.net.ssl.internal.www.protocol JSSETest 【結果】 java.lang.ClassCastException: com.ibm.net.ssl.internal.www.protocol.https.HttpsURLConnection at JSSETEST2.main(JSSETEST2.java:9)

    • ベストアンサー
    • Java
  • javaプログラミングの質問です。

    http://questionbox.jp.msn.com/qa1030602.html?StatusCheck=ON に載っている、プログラムを以下のようにQuestionというクラスで実行してみたところ、 import java.io.*; class Question{ public static void main(String Args[]){ BufferedReader reader = null; String strArray[][] = new String[4][4]; String fileName = "foo.txt"; int i = 0; int j = 0; try{ reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ){ StringTokenizer st = new StringTokenizer ( line ); while ( st.hasMoreTokens() ){ strArray[i][j] = st.nextToken(); System.out.print ( strArray[i][j] + " " ); j ++; } j = 0; i ++; System.out.println (""); } } catch ( Exception e ){ System.out.println ( e.toString() ); } } } Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 StringTokenizer を型に解決できません。 StringTokenizer を型に解決できません。 というエラーが出ます。 このサイトの質問者はうまくいっているようなのですが、私のコンパイラがうまく動いていないのでしょうか? java version "1.6.0_07" を使っていて、Eclipseを用いてコンパイルをしたりしています。 どなたかご指摘をどうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaのカウント方法について

    お伺い致します。 CSVで取り込んだデータの抽出をしたいのですが、方法が見出せません。どの点を直せば宜しいのでしょうか。 具体的には取り込んだ郵便番号をカウントして(例:京都市,34)CSVファイルに出力するように出したいのですがカウントがうまくできません。(以下、コメントアウトしたものがありますが、今までのソースを記載します) 宜しく御願いします。 import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.*; public class test01 { static String fname ="26KYOUTO.CSV"; public static void main(String[] args){ if(args.length>0) fname = args[0]; try { BufferedReader reader = new BufferedReader(new FileReader(fname)); BufferedWriter pw = new BufferedWriter(new PrintWriter("orig.txt")); String line = reader.readLine(); System.out.println(line); pw.println(""); int n = 0; int count = 0; _/* while(true) { String line = reader.readLine(); if(line.equals("26101")) break; count++; } */ reader.close(); System.out.println("京都府北区=" +count ); } catch(FileNotFoundException e) { System.out.println("ファイルがありません。"); } catch(IOException e) { System.out.println("入出力エラーです。"); } } }

    • ベストアンサー
    • Java
  • Javaの問題について...

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.UnknownHostException; import javax.swing.JTextArea; public class html_getter { public static void main(String[] args){ Object o1 = null; try { o1 = new Getter5(new URL("http://www.google.com/")); } catch (MalformedURLException e) { e.printStackTrace(); } ((Getter5)o1).Show(); } } class Getter5{ private String charset = "Shift_JIS"; private JTextArea htmlArea; public Getter5(URL url){ htmlArea = new JTextArea(); try { URLConnection uc = url.openConnection(); BufferedInputStream bis = new BufferedInputStream(uc.getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset)); htmlArea.setText("");//初期化 String line; while ((line = br.readLine()) != null) { htmlArea.append(line + "\n"); } } catch (MalformedURLException ex) { htmlArea.setText("URLが不正です。"); ex.printStackTrace(); } catch (UnknownHostException ex) { htmlArea.setText("サイトが見つかりません。"); } catch (IOException ex) { ex.printStackTrace(); } } public void Show(){ System.out.println(htmlArea.getText()); } } このプログラムはURLの指定先からHTMLを取ってきて表示するプログラムなのですが、 これに「indexOfとString s1を使ってURLの指定先のHTMLから自分の入力した文字列があるかどうかを判断するプログラム」を作りたいのですがどうすれば作れるでしょうか?

専門家に質問してみよう