2009-01-27 19 views
12

Herkese selam. ServerSocket ve Socket sınıflarını kullanarak java'da yazılmış bir sunucum var.Java'da Yuva Bağlantısını Kesmekle nasıl başa çıkıyorsunuz?

Ben algılamak ve keser sapı ve ardından gerekirse yeni bir müşteri yeniden bağlanmak için mümkün istiyorum.

İstemci bağlantılarını algılamak, soketi kapatmak ve sonra yeni istemcileri kabul etmek için uygun prosedür nedir?

cevap

12

Muhtemelen, belki böyle bir BufferedReader olarak, giriş akımının sarmalayan kullanarak, prizden okuyorsun. Bu durumda, ilgili okuma işlemi -1 (ham okuma() çağrıları için) veya null (readLine() çağrıları için) döndüğünde akış sonunu algılayabilirsiniz. Ayrıca uygun uğraşmak gerekir kapalı bir soket üzerinde gerçekleştirilen zaman

belirli işlemler bir SocketException neden olacaktır.

+0

'Kapalı soket', * siz * eşin bağlantıyı kapattığını değil, soketi kapattığınız anlamına gelir. EOSis ile karşılaşıldığında belirtilen EOFException dışındaki tüm readXXX() yöntemleri. – EJP

4

gitti diğer ucunu tespit etmek için tek güvenli yolu periyodik kalp atışlarını göndermek ve bir kalp atışı eksikliği dayalı zaman aşımı diğer ucunu sahip olmaktır.

+0

Ya da zaman aşımı – Pyrolistical

+2

ayarlayabilirsin. Son paketin ne kadar süredir okunduğunu görmek için her bağlantıya bakan bir iş parçacığım var. (kalp atışı veya başka bir şekilde) Çok uzun oldu, bağlantıyı kapatıyorum. –

+0

@PeterLawrey, kalp atışı göndererek Telekomünikasyon sisteminin en iyi çözümlerinden biri, bağlantıyı kesmek için Heartbeat'u kullanıyor. –

0

Sadece benim mi, yoksa JavaDoc'un ServerSocket api altında bir yöntem belirlediğini fark etmedi, bu da sunucu kutusunun kapalı durumuna bağlı olarak bir boole elde etmemize olanak tanıyor mu?

sadece döngü birkaç saniyede bunun durumunu kontrol etmek edebilirsiniz:

if(!serverSocket.isClosed()){ 
    // whatever you want to do if the serverSocket is connected 
}else{ 
    // treat a disconnected serverSocket 
} 

DÜZENLEME: Sadece sorunu tekrar okuyarak, sadece sürekli bağlantıları için ve istemci eğer Sunucunun aramasını gerektiren görünüyor bağlantıyı keser, istemci yeniden bağlanmaya çalıştığında yeniden algılayabilmelidir. ilk etapta çözümünüz değil mi?

bir istemci bağlantısı alır kez, bir iş parçacığı nesnesine geçmek ve asenkron olarak işletmek için başlatması gerektiğini, dinliyor bir sunucu var. Ardından sunucu yeni bağlantıları dinlemeye geri dönebilir. Eğer istemcinin bağlantısı kesilirse, başlatılan iş parçacığı ölmeli ve yeniden bağlandığında, yeni bağlantıyı işlemek için yeni bir iş parçacığı başlatılır.

Jenkov bu uygulamanın büyük bir örnek sunmaktadır.

+0

'isClosed()' eşlerin bağlantısının kesildiğini size bildirmez. Soketinizi * kapattığınızı * söyler *. – EJP

İlgili konular