2012-10-03 117 views
4

我有一個程序在服務器(服務器A)上運行,它偵聽一個端口上的外部連接(來自外部服務器B),然後偵聽另一個端口同一臺服務器(服務器A)上的內部連接。然後它將數據從內部傳遞到外部連接並再次傳回。如何檢測客戶端何時與服務器斷開連接

我想知道是否有方法可以檢測到客戶端外部已斷開連接。我一次只需要一個外部連接,但是如果外部客戶端重新引導或者類似的話,我希望能夠接受一個新的連接。

這個套接字級別的東西對我來說都是相當新的,所以如果有更好的方法來解決這個問題的話,我全都是耳朵。一個規定是在服務器B上運行的客戶端必須是發起連接的客戶端,並且連接必須儘可能長時間地存在。

public void handleConnection() { 
    System.out.println("Waiting for client message..."); 
    try { 
     SSLSocket extSocket = (SSLSocket) this.externalServerSocket.accept(); 

     ObjectInputStream externalOis = new ObjectInputStream(extSocket.getInputStream()); 
     ObjectOutputStream externalOos = new ObjectOutputStream(extSocket.getOutputStream()); 
     System.out.println("Client connection establisthed"); 
     // Loop here to accept all internal connections 
     while (true) { 

      SSLSocket internalSocket = (SSLSocket) this.internalServerSocket.accept(); 
      new ConnectionHandler(externalOis, externalOos, internalSocket); 

     } 
    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
     return; 
    } 
} 

class ConnectionHandler implements Runnable { 
    private SSLSocket internalSocket; 

    private ObjectOutputStream internalOos; 
    private ObjectInputStream internalOis; 

    private ObjectInputStream externalOis; 
    private ObjectOutputStream externalOos; 

    public ConnectionHandler(ObjectInputStream externalOis, 
      ObjectOutputStream externalOos, SSLSocket internalSocket) { 

     this.internalSocket = internalSocket; 

     try { 
      this.internalOis = new ObjectInputStream(this.internalSocket.getInputStream()); 
      this.internalOos = new ObjectOutputStream(this.internalSocket.getOutputStream()); 

      this.externalOis = externalOis; 
      this.externalOos = externalOos; 

     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } 
     new Thread(this).start(); 
    } 

    @Override 
    public void run() { 
     try 
     { 

      // process data 
      Object o = internalOis.readObject(); 
      externalOos.writeObject(o); 
      Object o2 = externalOis.readObject(); 
      internalOos.writeObject(02); 

      internalOos.close(); 
      internalOis.close(); 

      this.internalSocket.close(); 

     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 
+1

使服務器以循環方式對客戶端進行ping操作......只要有客戶端丟棄三個ping,就會斷開連接。想想在電話線路上被切斷的談話 - 沒有一個參與者期望它,並且能夠說再見。 – Shark

回答

0

如果客戶端斷開連接,readObject()將拋出EOFException,並write()將拋出IOException: connection reset。這就是你需要的。

相關問題