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。您没有发布此方法的代码,但我假设它没有抛出 SocketTimeOutException,这就是 netbeans 突出显示的原因。

于 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

我会声明LireTrame()完全抛出IOException并删除内部的 try/catch。它的代码结构很差。

于 2012-05-12T00:02:06.103 回答
-1

这无疑是在黑暗中拍摄的。我不使用netbeans,我使用eclipse。在 Eclipse 中,有时 JDT 编译器会与现实不同步。对项目进行干净的构建可以解决问题。

我认为在您的情况下,是 netbeans 在起作用。如果您执行 javac 的命令行调用,您是否会收到该错误。如果没有,在 netbeans 内部进行清理很可能会解决问题。

于 2012-05-11T19:18:27.567 回答