2016-12-07 10 views
0

私のクライアントソケットがIOExceptionに落ち続ける理由を理解できません。 IOExceptionに落ちたときに私のソケットを再作成して、再び例外になるまでそれが再び働くでしょう...javaクライアント側でソケットを開く

コードは、私の電気設備から常にipコントローラを読み出すべきです。私はサーバー側の何かを変更することはできません。私はそれに接続し、何かが起こったときにそれはポートに投稿し、私はそれを読むことができるようにしたい。

この

は、私はそれがはるかに良いコーディングからworkesデータ

 while(true){ 
     try { 
      DataInputStream din=new DataInputStream(knxC.clientSocket.getInputStream()); 
      BufferedReader br = new BufferedReader(new InputStreamReader(din)); 
      String[] str=br.readLine().split(""); 
      System.out.println(Arrays.toString(str)); 

     } catch (IOException e) { 
      try { 
       knxC.clientSocket = new Socket(knxC.IP, knxC.PORT); 
      } catch (UnknownHostException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } catch(NullPointerException nex){ 
      try { 
       knxC.clientSocket = new Socket(knxC.IP, knxC.PORT); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }  
    } 

を読み出すオープニングソケットコード

public KnxController(){ 
    try{ 
     System.out.println("Server started"); 
     clientSocket = new Socket(IP, PORT); 
     outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    } catch (UnknownHostException e) { 
     System.out.println("UnknownHostException: kan knx niet vinden"); 
    } catch (IOException e) { 
     System.out.println("IOException knxcontroller: kan geen data sturen"); 
    } 

とここにあります。 これを解決する方法についての助けをいただければ幸いです。

+0

ないKNX規格に精通を開く

興味を持っている人のため、上記のコードを掃除しました。私は次のことを確認することを提案することができます:もし1つのトランザクションの後にサーバーが接続を閉じることが完全に正常なことかもしれません。または、サーバーに「アイドル」接続タイムアウトがある可能性があります。一部のプロトコルには、そのための「NOP」 - 動作またはキープアライブのメカニズムがいくつかあります。 KNXがそうでない場合、あなたは確かに何とか回避することができます。それでも、あなたは接続の失敗をとにかく処理する必要があります。 – Fildor

+0

それは素晴らしい答えです、実際に通信可能なビットがあります。 –

+0

"IOExceptionに落ちる" - > _thrown_であるIOExceptionのスタックトレース+例外メッセージを投稿してください –

答えて

0

はソケット

public KnxController(){ 
    do{ 
     setClientSocket(); 

     try { 
      outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     } catch (IOException e) { 
      log.error("IOException knxcontroller: kan geen data out stream starten naar knx"); 
     } catch (NullPointerException nEx){ 
      log.error("NullPointerException knxcontroller: geen knx host"); 
     } 
    }while(clientSocket == null); 

    KnxSocketListener knxL = new KnxSocketListener("KnxSocketListener", this); 
    knxL.start(); 
} 

    public void setClientSocket() { 
    try { 
     this.clientSocket = new Socket(IP, PORT); 
    } catch (UnknownHostException e) { 
     log.error("UnknownHostException: kan geen socket opbouwen met knx host"); 
    } catch (IOException e) { 
     log.error("IOException: kan geen socket opbouwen met knx host"); 
    } 
} 

新しいスレッドパブリッククラスでsocketlistener KnxSocketListener

public KnxSocketListener(String name, KnxController knxC) { 
     threadName = name; 
     System.out.println("Creating " + threadName); 
     this.knxC = knxC; 
} 

public void start() { 
     System.out.println("Starting " + threadName); 
     if (t == null) { 
     t = new Thread (this, threadName); 
     t.start(); 
     } 
} 

public void run() 
{ 
    while(true){ 
     try { 
      DataInputStream din = new DataInputStream(knxC.getClientSocket().getInputStream()); 
      BufferedReader br = new BufferedReader(new InputStreamReader(din)); 
      String[] str=br.readLine().split(""); 
      System.out.println(Arrays.toString(str)); 
     } catch (IOException e) { 
      knxC.setClientSocket(); 
     } catch(NullPointerException nex){ 
      knxC.setClientSocket(); 
     }  
    } 
} 
関連する問題