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