2013-07-26 122 views
-1

我有一個Java程序與套接字。我需要檢查客戶端是否已斷開連接。我需要一個例子如何做到這一點。我已經研究過,但我不明白。那麼有人可以編寫示例代碼並解釋所有內容。如何檢查客戶端是否已斷開連接?

對不起壞英語 我的代碼:

package proov_server; 

//SERVER 2 
import java.io.*; 
import java.net.*; 

class server2 { 
    InetAddress[] kasutaja_aadress = new InetAddress[1000]; 
    String newLine = System.getProperty("line.separator"); 
    int kliendiNr = 0; 
    int kilene_kokku; 
    server2(int port) { 

    try { 

     ServerSocket severi_pistik = new ServerSocket(port); 
     System.out.println("Server töötab ja kuulab porti " + port + "."); 


     while (true) { 

     Socket pistik = severi_pistik.accept(); 
     kliendiNr++; 

     kasutaja_aadress[kliendiNr] = pistik.getInetAddress(); 
     System.out.println(newLine+"Klient " + kliendiNr + " masinast " 
         + kasutaja_aadress[kliendiNr].getHostName() + " (IP:" 
         + kasutaja_aadress[kliendiNr].getHostAddress() + ")"); 

     // uue kliendi lõime loomine 
     KliendiLoim klient = new KliendiLoim(pistik,kliendiNr); 

     // kliendi lõime käivitamine 
     klient.start(); 

     } 
    } 
    catch (Exception e) { 
     System.out.println("Serveri erind: " + e); 
    } 
    } 

    DataOutputStream[] väljund = new DataOutputStream[1000]; 
    DataInputStream[] sisend = new DataInputStream[1000]; 

    int klient = 0; 
    int nr; 
    // sisemine klass ühendusega tegelemiseks 
     class KliendiLoim extends Thread { 

     // kliendi pistik 

     Socket pistik; 
     // kliendi number 


     KliendiLoim(Socket pistik2,int kliendiNr) { 
      nr = kliendiNr; 
      this.pistik = pistik2; 

     } 
     public boolean kontroll(){ 
      try{ 
       System.out.println("con "+pistik.isConnected()); 
       System.out.println("close "+pistik.isClosed()); 
       if(pistik.isConnected() && !pistik.isClosed()){ 
        //System.out.print(con_klient); 
        return true; 

       } 
      }catch(NullPointerException a){ 
       System.out.println("Sihukest klienti pole!!!"); 

      } 
      kliendiNr --; 
      return false; 

     } 

     public void run() { 
       try { 
        sisend[nr] = new DataInputStream(pistik.getInputStream()); //sisend 
        väljund[nr] = new DataOutputStream(pistik.getOutputStream()); //väljund 
       }catch (Exception ea) { 
        System.out.println(" Tekkis erind: " + ea); 
       } 
       while(true){ 
         try{ 


         BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

         System.out.print("Sisesta k2sk: "); 
         String k2sk = null; 
         k2sk = br.readLine(); 
         /* 
         String command; 
         if(k2sk.indexOf(" ") < 0){ 
          command = k2sk; 
         }else{ 
          command = k2sk.substring(0, k2sk.indexOf(" ")); 
         } 
         */ 
         String[] words = k2sk.split("\\s+"); 
         for (int i = 0; i < words.length; i++) { 
          words[i] = words[i].replaceAll(" ", ""); 
         } 
         switch(words[0]){ 
         case "suhtle": 

          if(väljund.length > klient && väljund[klient] != null) 
          { 
           väljund[klient].writeUTF("1"); 


          }else{ 
           väljund[klient] = null; 
           sisend[klient] = null; 
           System.out.println("Sihukest klienti pole"); 
          } 
         break; 
         case "vaheta": 
          try{ 
           int klinetnr = Integer.parseInt(words[1]); 
           //if(kontroll(klinetnr)){ 
            klient = Integer.parseInt(words[1]); 
           //} 
          } 
          catch(NumberFormatException e){ 
           System.out.println("See pole number!!! "); 
          } 
         break; 

         case "kliendid": 
          if(kliendiNr != 0){ 
           for(int i=1;i <= kliendiNr;i++){ 
            if(kontroll()){ 
             System.out.println("Klient:"+i+" ip: " + kasutaja_aadress[i]); 
            }else{ 
             System.out.println("Pisi"); 
             väljund[klient] = null; 
             sisend[klient] = null; 
            } 
           } 
           System.out.println(newLine); 
          }else{ 
           System.out.println("Kiente pole"); 
          } 
         break; 

         } 
         System.out.println(kliendiNr); 
        }catch(SocketException a){ 
         System.out.println("Klient kadus"); 

        } 
        catch(Exception e){ 
         System.out.println(" Viga: " + e); 
        } 

      } 
     } 



    } 
    public static void main(String[] args) { 
     new server2(4321); 

    } 
} 
+2

您可以向我們提供一些您的代碼,以便我們幫助您! – jsalonen

+1

我做了複製粘貼。我是新的java – user2610533

+0

有很多代碼,並且一些變量名稱不是英文的。我建議你翻譯它們中的一部分,這樣它可以更容易閱讀。這不是一項義務,但它可以提供幫助。 –

回答

0

與解決方案一起#2 here一個相關的線程。基本上,解決方案認爲檢測客戶端 - 服務器斷開連接的最佳方式是嘗試從套接字讀取。如果讀取成功,則連接處於活動狀態。如果在讀取期間拋出異常,則客戶端和服務器之間不存在連接。或者,可能會發生套接字配置了讀取操作完成的超時值。如果超過此超時值,則會拋出套接字超時異常,這可以視爲客戶端斷開連接或網絡關閉。

該帖子還談到了使用isReachable方法 - 請參閱InetAddress documentation。但是,此方法僅告訴我們遠程主機是否可訪問。這可能只是之一客戶端從服務器斷開連接的原因之一。您無法使用此技術檢測由於客戶端崩潰或終止而導致的斷開連接。

+0

我想知道如果插座連接,但沒有什麼可讀的,會發生什麼? –

+1

我對答案做了一個小小的修改 - 萬一套接字已連接並且沒有任何可讀的內容,那麼不會拋出異常,程序會繼續執行下一行。只有當套接字斷開時,從套接字讀取會導致異常。 –

+0

這是不正確的。如果你已經在阻塞模式下設置了讀超時,並且沒有數據,你將會得到一個SocketTimeoutException。這取決於您是否意味着對等端處於非活動狀態或網絡已關閉。您所引用的主題中的答案質量很低。 – EJP

4

如果客戶端已經正常斷開:

  • read()將返回-1
  • readLine()返回null
  • readXXX()任何其他X拋出EOFException

檢測丟失的TCP連接的唯一真正可靠的方法是寫入它。最終這會拋出一個IOException: connection reset,但由於緩衝至少需要兩次寫入。

相關問題