2013-07-26 124 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,但由于缓冲至少需要两次写入。

相关问题