ConnectionTimeout ve SocketTimeout


135

Kullandığım bir kitaplıkla ilgili bir sorun yaşıyorum. Kitaplık olabilir ya da yanlış kullanıyorum!

Temel olarak, bunu yaptığımda (milisaniye cinsinden zaman aşımı)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Zaman aşımı istisnası oluşturulmadı ve sorunsuz çalışıyor, ancak aşağıdakileri yaptığımda,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Soket İstisnası alıyorum.

Öyleyse sorum şu: Neden bir Bağlantı İstisnasını simüle edemiyorum? Soket ile bağlantı zaman aşımı arasındaki farkı yanlış mı anlıyorum? Kütüphane burada (henüz resmi olarak yayınlanmadı).

Yanıtlar:


227

Bir bağlantı zaman aşımı yalnızca TCP bağlantısı başlatıldığında gerçekleşir. Bu genellikle uzak makine yanıt vermediğinde olur. Bu, sunucunun kapatıldığı, yanlış IP / DNS adı kullandığınız, yanlış bağlantı noktasının kullanıldığı veya sunucuya ağ bağlantısının kesildiği anlamına gelir.

Sürekli gelen veri akışını izlemek için bir soket zaman aşımı ayrılmıştır. Veri akışı belirtilen zaman aşımı süresince kesilirse, bağlantı kesilmiş / kesilmiş olarak kabul edilir. Elbette bu yalnızca verilerin her zaman alındığı bağlantılarda çalışır.

Soket zaman aşımını 1 olarak ayarlayarak bu, her milisaniyede yeni verinin alınmasını gerektirir (veri bloğunu akıllıca okuduğunuzu ve bloğun yeterince büyük olduğunu varsayarak)!

Yalnızca gelen akış bir milisaniyeden fazla durursa bir zaman aşımına giriyorsunuz demektir.


1
Sunucu kapalı değilse ancak meşgulse bağlantı zaman aşımına uğrayabilir misiniz? Yoksa soket zaman aşımı mı olur?
Robert

9
Bu, sunucuya aşırı yüklenmeden önce TCP bağlantısı kurulmuşsa, bir soket istisnası alırsınız - aksi takdirde, TCP bağlantısının kurulamadığını belirten bir bağlantı istisnası alırsınız.
Robert

2
Özellikle daha eski mobil ağların yüksek gecikme süresi göz önüne alındığında, bağlantı zaman aşımı birkaç saniyeye ayarlanmalıdır (örneğin 10sn veya daha iyi 10000 msn). Soket zaman aşımı sadece birkaç bağlantı kullanmazsanız ayarlardım çünkü HTTP bir istekten sonra bağlantıyı yeniden kullanabilir.
Robert

1
Bu, bir soket zaman aşımı ayarlarsanız (örn. 1 dakika), bağlantının 1 dakikalık hareketsizlikten sonra kesileceği ve zaman aşımı ayarlanmadıysa normalde yeniden kullanılacağı anlamına mı geliyor?
Robert

2
@Robert Sunucu çok meşgulse mutlaka bir bağlantı istisnası almayacaksınız. Platform bağımlıdır, sunucu platformuna bağlıdır. Soket okuma zaman aşımı, bağlantıyı kesmez. Yalnızca SocketTimeoutException'a neden olur. Bağlantının hala kullanılabilir olup olmadığı, başvurunun vermesi gereken bir karardır. Sokette daha fazla G / Ç deneyemeyeceğinizi söyleyen API hakkında kesinlikle hiçbir şey yok. Birden fazla bağlantı kullanırsanız, zaman aşımını kullanmama hakkındaki ifadeniz anlam ifade etmez. Burada çok fazla yanlış bilgi var.
Lorne Markisi

83

Bir bağlantı zaman aşımı programı kurulumu başka bir işlem ile bağlantı beklemek istekli olduğunu zaman maksimum miktardır. Bu noktada herhangi bir uygulama verisi almıyor veya göndermiyorsunuz, sadece bağlantıyı kuruyorsunuz.

Bir soket zaman aşımı bireysel paketler için bekleyen zaman aşımı olduğunu. Soket zaman aşımının, tam yanıtı almak için zaman aşımı olduğu yaygın bir yanılgıdır. Dolayısıyla, 1 saniyelik bir soket zaman aşımına sahipseniz ve her yanıt paketinin 2,7 saniyelik bir toplam yanıt süresi için gelmesi 0,9 saniye süren 3 IP paketinden oluşan bir yanıtınız varsa, zaman aşımı olmayacaktır.


3
Tamam. 1. SocketTimeout'un yalnızca bir Bağlantı zaten kurulduğunda devreye girdiğini söyleyebilir miyiz? 2. Ya 3 paket alındıktan sonra 5 dakika gibi bir veri akışı yoksa? 3. paket alındıktan sonra SocketTimeout istisnası olacak mı?
Saurabh Patil

2
@SaurabhPatil 1. Evet. Onay için Wikipedia'nın HTTP protokolüne Teknik Genel Bakış bölümüne bakın . 2. Mesajın sonu gönderildikten sonra, başka veri gerekmez, bu nedenle soket zaman aşımı meydana gelmez. Konuyla ilgili bu cevaba bakın .
entpnerd

7
Keşke "soket zaman aşımı" nı "boşta kalma zaman aşımı" olarak adlandırsalar.
Manish Maheshwari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.