![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.6
- 回答日時:
下記のURLが役に立つかもしれません。
Javaで同様の問題が発生した人の例です。
下記URLの場合、JDBCの接続ですが、HTTPと同じように考えて差し支えないと思います。
ご不明な点がありましたら、またお書きください。
参考URL:http://www.mysql.gr.jp/mysqlml/mysql/msg/9640
この回答への補足
回答いただきありがとうございます。
正直、何が書いてあるのかさっぱりでした。
残念ながら、私には無理かもしれません。
もうすこし、JAVAの勉強をやったほうがいいかとも思っていますが、もし、参考になる本がありましたら、宜しくお願い致します。
No.5
- 回答日時:
Address already in use のエラーは、使用しようとしたアドレスが既に他のソケットで使われているときに発生するものです。
以下、試していないので、想像で書きます。
いくつか考えられる原因があります。
1) 同じアドレスを同時に(別スレッドで)開こうとしていないか。
URL.dat というファイルにURLを記述されているそうですが、
そこに重複したアドレスが存在しないでしょうか。
または、以下のような2つのアドレスは同時に処理できますか。
http://www.hoge.com/
http://www.hoge.com/~user/
2) TIME_WAIT の問題
下記参考URLに詳しく書かれていますが、簡単に言えば、ソケットをcloseしても、すぐにソケットは閉じず、しばらくTIME_WAIT状態となって残るということです。つまり、1つのクライアントから大量の接続・切断を短時間のうちに繰り返すと問題が発生する可能性があるということです。
SO_REUSEADDRソケットオプションをTRUEにすることで対処できる可能性があります。
もしくは、一度開いたソケットを使い回すことで解決できます。
参考URL:http://mikilab.doshisha.ac.jp/dia/research/repor …
この回答への補足
深夜の回答いただきありがとうございます。
回答いただいた後から、いろいろ、ソケットについて調べたのですが、私のレベルではよく分かりませんでした。
なんとなく、JAVAで使えそうなURLまではたどり着いたのですが・・・
もし、お時間がありましたら、これをどのように実装すればよいのか教えていただけないでしょうか?
宜しくお願い致します。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socke …
No.4
- 回答日時:
今気が付きましたけど、
#2で示したコードは、実際のものとは違うのですね?
でしたら、このコードで同じ状況が発生するか試してください。
この回答への補足
回答いただきありがとうございます。
このファイル単体でも動作させてみたのですが、やはり発生しました。ただし、今回は実験的に、#2補足の
if(loop == 2){の2を100にしてみました。
何百行かは正常に進むのですが、ある一定まで進むと、
address already in use: connect java
というエラーがでます。
また、実際にやっては居ませんが、このエラーが出たということは、多分、何時間か作動させればそのうち止まるのではないかと考えています。
なにか、良い案はないでしょうか?
宜しくお願い致します。
1.ファイル「URL.dat」の内容
http://www.yomiuri.co.jp/
http://www.reuters.com/news.jhtml
http://www.kyodo.co.jp/
http://ascii24.com/
http://www.china.org.cn/japanese/
という感じでドメインの異なる、URLを50000程度列挙しています。
No.3
- 回答日時:
なんか、プログラムの作りというか、流れがおかしい気がします。
一応、あなたの考えている、次のことを教えてもらえませんか?
1.ファイル「URL.dat」の内容
2.各クラス(Test、Kaiseki2)の役割
3.全体の流れ(概略で結構ですが、説明には各クラスを登場させてください)
No.2
- 回答日時:
すみません、ちょっとわかり難いのですが。
fr.write(i);
}
} ←←←←
in.close();
fr.close();
os.close();
break;
上の←に対応した括弧はどこですか?
この回答への補足
回答いただきありがとうございます。
しかも、単純ミスをしておりすみませんでした。
今度は、単体でも動くように改良しています。
import java.net.*;
import java.io.*;
class Test {
public static void main(String args[]) throws IOException{
try {
InputStream is = new FileInputStream("URL.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
int cnt = 1;
int loop = 0;
int cc = 0;
int count = 0;
for(;;) {
loop++;
cnt++;
Kaiseki2 run[] = new Kaiseki2[cnt];
String h[] = new String[cnt];
h[cnt-1] = br.readLine();
if(h[cnt-1] != null) {
run[cnt-1] = new Kaiseki2(h[cnt-1]);
run[cnt-1].start();
}else{
break;
}
if(loop == 2){
count = cnt - 1;
System.out.println("Kaiseki() : " + count);
run[cnt-1].join();
loop=0;
}
}
br.close();
is.close();
}catch(Exception ex){System.out.println("エラー: Kaiseki()");System.out.println(ex.getMessage());}
}
}
class Kaiseki2 extends Thread {
private String h = null;
Kaiseki2(String str) {
this.h = str;
}
public void run() {
int LOOP_MAX = 10;
int loopcnt = 0;
int oldasincnt = 0;
try {
OutputStream os = new FileOutputStream("出力.txt",true);
BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os));
URL url = new URL(h);
while(loopcnt < LOOP_MAX){
try{
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect"));
for (;;) {
String i = in.readLine();
if( i == null) {break;}
fr.write(i+"\n");
}
in.close();
fr.close();
os.close();
break;
}catch(Exception e){
loopcnt ++;
System.out.println(url);
System.out.println(loopcnt);
System.out.println("30秒休憩"); // ウェイト処理
System.out.println(e.getMessage());
Thread.sleep(30000);
}
}
}catch(Exception ex){System.out.println("エラー: Kaiseki2()");System.out.println(ex.getMessage());}
}
}
お礼欄で申し訳ありませんが、追伸です。
class Kaiseki2 extends Thread {の
fr.write(i+"\n");
という部分がありますが、実際のプログラムでは、ホームページ全部を記録するのではなく、ホームページ中の一部分だけを抜き出しています。
また、時々、
Unexcepted end of file from server
address already in use: connect java
というエラーも出ます。しかし、時間を置いてアクセスするとエラーを回避できるので、これが出たときにループにしています。
しかし、抜本的な解決になっていません。
もし、これについても、お分かりになりましたら、宜しくお願い致します。
No.1
- 回答日時:
>こういったエラー表示の出ないエラーを解決するにはどうしたらよいでしょうか?
プログラムを作っていて、予定した動作と違っていたことはありませんか?
例えば、出力したファイルにレコードが10件あるはずなのに、1件しかなかったとか。
それと同じです。
処理がどのような流れで実行されるのかを想定しておいて、
その通りにいっているのかを確認しながら実行させます。
確認の方法は、処理の途中で変数を表示します。
そうやって、どこが悪いのかを特定します。
もしかしたら、特定の1行が悪いのではなく、処理の流れそのものに問題が
あるのかもしれません。
頑張ってください。
この回答への補足
回答いただきありがとうございます。
それも何度か試してみたのですが、どうもわかりません。
WindowsOSの限界ですかね?
一応、参考までにコードを記載しておきます。
お分かりになる方、何か、お気づきの方、ご指摘、宜しくお願い致します。
public class Kaiseki {
public void read() {
try {
InputStream is = new FileInputStream("URL.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
int cnt = 1;
int loop = 0;
int cc = 0;
int count = 0;
for(;;) {
loop++;
cnt++;
Kaiseki2 run[] = new Kaiseki2[cnt];
String h[] = new String[cnt];
h[cnt-1] = br.readLine();
if(h[cnt-1] != null) {
run[cnt-1] = new Kaiseki2(h[cnt-1]);
run[cnt-1].start();
}else{
break;
}
if(loop == 8){
count = cnt - 1;
System.out.println("Kaiseki(): " + count);
run[cnt-1].join();
loop=0;
}
}
br.close();
is.close();
}catch(Exception ex){System.out.println("エラー: Kaiseki()");System.out.println(ex.getMessage());}
}
}
class Kaiseki2 extends Thread {
private String h = null;
Kaiseki2(String str) {
this.h = str;
}
public void run() {
int LOOP_MAX = 10;
int loopcnt = 0;
int oldasincnt = 0;
try {
OutputStream os = new FileOutputStream("出力.txt",true);
BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os));
URL url = new URL(h);
while(loopcnt < LOOP_MAX){
try{
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect"));
for (;;) {
String i = in.readLine();
if( i == null) {break;}
fr.write(i);
}
}
in.close();
fr.close();
os.close();
break;
}catch(Exception e){
loopcnt ++;
System.out.println(url);
System.out.println(loopcnt);
System.out.println("30秒休憩"); // ウェイト処理
System.out.println(e.getMessage());
Thread.sleep(30000);
}
}
} catch(Exception ex) {System.out.print("エラーkaiseki2");System.out.println(ex.getMessage());}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java mac mini 2009 でのmac OS における Java の入れ替えについて 1 2022/12/27 19:23
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- システム 外付けHDDの初期化について 4 2023/03/05 21:19
- システム 外付けHDDの初期化について 4 2023/03/05 20:00
- 確定申告 e-TAXで確定申告をしています。 ふるさと納税の金額を寄付先から交付されたデータを読み込ませて対応 3 2023/02/23 08:05
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- その他(メールソフト・メールサービス) サンダーバードメール移動しない 1 2023/05/13 11:21
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- その他(ブラウザ) Edge internet explorer モードのサイトの再読み込みを許可 表示されない 2 2023/03/03 12:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
アコーディオンメニューをアン...
-
Thread.sleep()はすべてのスレ...
-
Windowsサービスの処理
-
JSP、サーブレットの初期処理
-
Delphiのマルチスレッドの割り...
-
C#で別スレッドの終了を知りたい
-
[Java] while(true)の意味
-
Tomcat高負荷時の設定について
-
素数判定を再帰処理で
-
setTimeOutとsetInterval、どっ...
-
ラジオボタンの選択判定
-
WPF C#でF10のイベント取得方法...
-
キューについて
-
wait()したスレッドが起こされ...
-
JavaScriptからJAVAクラスを呼...
-
バッチって何でしょうか?
-
数値の定数を付ける時
-
JAVAにおける画像のJPEG保存の...
-
Servlet+JSPを使ったWEBアプリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
JavaScriptからJAVAクラスを呼...
-
Javaでのデバッグコード削除
-
WPF C#でF10のイベント取得方法...
-
数値の定数を付ける時
-
Tomcat高負荷時の設定について
-
Javaプログラムからポップアッ...
-
JavaでVBのDOEVENTSと同様の処...
-
JSP、サーブレットの初期処理
-
switch文の中に、throws new Ex...
-
ExcelVBA で文字列の特定の文字...
-
VBScriptでのWord印刷
-
ラジオボタンの選択判定
-
Javaアプリケーション実行の返...
-
C#で別スレッドの終了を知りたい
-
ftp 同時複数接続の負荷テスト...
-
ブラウザを閉じた後のサーバ側...
-
javaのプログラムが止まる
-
[Java] while(true)の意味
おすすめ情報