2

私は単純なマルチスレッド サーバーを持っています。スレッドのコードは次のようになります。

public void run(){

 while(Ecoute()){

     str=LireTrame(this.socClient);//read text byte by byte 

    //some code here

    Dormir(500);//Sleep for 500ms  
   }     


}

3 分間のタイムアウトを作成したいのですが、クライアント ソケットが 3 分以内にメッセージを送信しない場合は、スレッドを閉じる必要があります...

だから私はそれを試します:

 public void run(){

        try {
        socClient.setSoTimeout(180000);//timeout for 3 min...
    } catch (SocketException ex) {
        Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);
    }


 while(Ecoute()){

     try{
      str=LireTrame(this.socClient);//read text byte by byte 
    }
    catch(java.net.SocketTimeoutException ex){
     log.append("timeout exception has benn catched \n") ;
     break;//break the while
   } 

    //some code here

    Dormir(500);//Sleep for 500ms  
   }     


}

問題は、netbeans がエラー メッセージを表示することです。 ここに画像の説明を入力

java.net.SocketTimeoutException never thrown in body of corresponding try statement

私は SocketException でこれを試しましたが、同じ結果..

なぜ私はそれらを捕まえることができないのですか?

更新: thinksteep と mprabhat からの応答に基づいて、LireTrame(..) に th throw を追加しましたが、それでも例外をキャッチできません:

 public  String LireTrame(Socket socClient) throws java.net.SocketTimeoutException{
 int c = 0;
  String Nmea="";
boolean finL=true;
 do{
            try {
                c=socClient.getInputStream().read();
            } catch (IOException ex) {
                Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);
            }
    char ch=(char)c;

    Nmea=Nmea+ch;
    if(ch==';')
        finL=false;

  }while(finL);
 return Nmea;
 }



mai 11, 2012 8:04:02 PM Daemon.tache LireTrame
Grave: null
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at Daemon.tache.LireTrame(tache.java:232)
    at Daemon.tache.run(tache.java:87)
    at java.lang.Thread.run(Thread.java:722)

そうでなければこれを作るアイデアはありますか?

4

4 に答える 4

1
=LireTrame(this.socClient);//read text byte by byte

SocketTimeOutException をスローする必要があります。このメソッドのコードを投稿しませんでしたが、netbeans が強調表示される理由である SocketTimeOutException をスローしていないと思います。

于 2012-05-11T18:47:28.913 に答える
0

SocketTimeoutExceptionチェック例外であるため、キャッチする前にその例外をスローする必要があります。

そう

=LireTrame(this.socClient);//read text byte by byte

SocketTimeoutExceptionキャッチする前に投げるべきです。

例外をログに記録しているだけで、再スローしていません

この行の後

Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);

この行も追加してください

 throw SocketTimeoutException('SocketTimeOutException');
于 2012-05-11T18:59:20.740 に答える
0

内部の try/catch を完全LireTrame()にスローして削除することを宣言します。IOExceptionそのままでは構造化されていないコードです。

于 2012-05-12T00:02:06.103 に答える
-1

これは確かに暗闇の中でのショットです。私はnetbeansを使用せず、Eclipseを使用します。Eclipseでは、JDTコンパイラが現実と同期しなくなることがあります。プロジェクトのクリーンビルドを実行すると、問題が解決します。

あなたの場合、動作しているのはNetBeansだと思います。javacのコマンドライン呼び出しを行う場合、そのエラーが発生しますか。そうでない場合は、NetBeans内をクリーンアップすることで、問題が解決する可能性が非常に高くなります。

于 2012-05-11T19:18:27.567 に答える