2013-07-26 2 views
-1

소켓이있는 Java 프로그램이 있습니다. 클라이언트 연결이 끊어 졌는지 확인해야합니다. 어떻게해야하는지 예제가 필요합니다. 나는 연구했지만 이해하지 못한다. 그래서 누군가가 예제 코드를 만들고 모든 것을 explane 할 수 있습니다. 나쁜 영어 내 코드에 대한 유감클라이언트의 연결이 끊어져 있는지 확인하는 방법은 무엇입니까?

:

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

Google에서 도와 드릴 수 있도록 일부 코드를 제공해 주실 수 있습니까? – jsalonen

+1

붙여 넣기를 복사했습니다. 나는 자바가 처음이다. – user2610533

+0

많은 코드가 있으며 변수 이름 중 일부는 영어가 아니다. 나는 당신이 그 중 일부를 번역하여 읽기가 더 쉬울 것을 제안합니다. 이것은 의무는 아니지만 도움이 될 수 있습니다. –

답변

0

솔루션과 함께 유래 here에 관련 스레드. 기본적으로이 솔루션은 클라이언트 - 서버 연결을 감지하는 가장 좋은 방법은 소켓에서 읽기를 시도하는 것이라고 말합니다. 읽기가 성공적이면 연결이 활성화됩니다. 읽기 중에 예외가 발생하면 클라이언트와 서버간에 연결이 없습니다. 또는 읽기 작업을 완료하기 위해 소켓에 시간 초과 값이 구성되어있을 수 있습니다. 이 시간 초과가 초과되면 (자), 소켓 타임 아웃 예외가 슬로우되어 클라이언트가 절단되었거나 네트워크가 다운 된 것으로 간주 될 수 있습니다.

게시물은 isReachable 방법 - InetAddress documentation을 사용하는 방법에 대해서도 이야기합니다. 그러나이 방법은 원격 호스트에 연결할 수 있는지 여부 만 알려줍니다. 이 경우 중 하나 인 중 하나 일 수 있으며 클라이언트가 서버에서 연결을 끊은 이유입니다. 이 기술을 사용하여 클라이언트 충돌 또는 종료로 인한 연결 끊김을 감지 할 수 없습니다.

+0

소켓이 연결되어 있지만 읽을 것이 없다면 어떻게 될까요? –

+1

답변에 약간의 수정을가했습니다. 소켓이 연결되어 있고 읽을 내용이 없으면 예외가 throw되지 않고 프로그램이 다음 줄을 계속 실행합니다. 소켓이 단절된 경우에만 소켓에서 읽으면 예외가 발생합니다. –

+0

그건 맞지 않아. 블로킹 모드에서 읽기 타임 아웃을 설정했고 아무런 데이터도 없다면 SocketTimeoutException을 얻을 것이다. 피어가 비활성이거나 네트워크가 다운되었는지 여부는 사용자가 결정할 수 있습니다. 귀하가 인용 한 답변은 매우 낮은 품질입니다. – EJP

4

클라이언트가 제대로 연결이 끊어진 경우

  • read() -1을 돌려줍니다
  • readLine() 반환 X는 EOFException 던져 다른위한
  • readXXX()을줍니다.

손실 된 TCP 연결을 감지하는 유일한 방법은 실제로 쓰기입니다. 결국 이것은 IOException: connection reset을 던지지만, 버퍼링으로 인해 적어도 두 번 씁니다.

관련 문제