Soketler için bağlantı ve okuma zaman aşımı arasındaki fark nedir?


180

3 soru:

  1. Soketler için bağlantı ve okuma zaman aşımı arasındaki fark nedir ?

  2. "Sonsuzluk" olarak ayarlanmış bağlantı zaman aşımı ne anlama geliyor? Hangi durumda mastar bir döngüde kalabilir? ve sonsuzluk döngüsünün ölmesini ne tetikleyebilir?

  3. "Sonsuzluk" olarak ayarlanmış okuma zaman aşımı ne anlama geliyor? Hangi durumda mastar bir döngüde kalabilir? ve sonsuzluk döngüsünün ölmesini ne tetikleyebilir?

Yanıtlar:


227

1) Soketler için bağlantı ve okuma zaman aşımı arasındaki fark nedir?

Bağlantı zaman aşımı, ilk bağlantıyı kurma zaman aşımıdır; yani TCP bağlantısı anlaşmasının tamamlanması. Okuma zaman aşımı, veri 1'in okunması için bekleme zaman aşımıdır . Özellikle, sunucu son bayttan <<zaman aşımı> saniye sonra bir bayt gönderemezse, bir okuma zaman aşımı hatası ortaya çıkar.

2) "Sonsuzluk" olarak ayarlanmış bağlantı zaman aşımı ne demektir? Hangi durumda mastar bir döngüde kalabilir? ve sonsuzluk döngüsünün ölmesini ne tetikleyebilir?

Bu, bağlantı girişiminin sonsuza dek engellenebileceği anlamına gelir. Sonsuz bir döngü yoktur, ancak bağlantı girişimi soketi kapatan başka bir iş parçacığı tarafından engellenebilir. (Bir Thread.interrupt()çağrı da hile yapabilir ... emin değilim.)

3) "Sonsuzluk" olarak ayarlanmış okuma zaman aşımı ne anlama gelir? Hangi durumda sonsuz bir döngüde kalabilir? Sonsuz döngünün bitmesini ne tetikleyebilir?

Bu read, soket akışına yapılan bir çağrının sonsuza dek engellenebileceği anlamına gelir . Bir kez daha sonsuz bir döngü yoktur, ancak readbir Thread.interrupt()çağrı, soketi kapatarak ve (elbette) diğer uç veri göndererek veya bağlantıyı kapatarak engellenebilir .


1 - Bir yorumcunun düşündüğü gibi ... bir soketin ne kadar süre açık veya boşta kalabileceğine dair zaman aşımı değil.


8

Bunlar, TCP bağlantısının kurulması ve soketten veri okunmasını bekleyen JVM tarafından uygulanan zaman aşımı değerleridir.

Değer sonsuza ayarlanırsa, sonsuza kadar beklemezsiniz. Bu sadece JVM'nin zaman aşımına sahip olmadığı ve işletim sisteminin tüm zaman aşımlarından sorumlu olacağı anlamına gelir. Ancak, işletim sistemindeki zaman aşımları gerçekten uzun olabilir. Yavaş bir ağda, 6 dakika boyunca zaman aşımlarını gördüm.

Soket için zaman aşımı değerini ayarlasanız bile, yerel kodda zaman aşımı gerçekleşirse çalışmayabilir. Güvenlik duvarı tarafından engellenen bir ana bilgisayara bağlanarak veya anahtardaki kabloyu çıkararak sorunu Linux'ta yeniden oluşturabiliriz.

TCP zaman aşımını işlemek için tek güvenli yaklaşım, bağlantı kodunu farklı bir iş parçacığında çalıştırmak ve çok uzun sürdüğünde iş parçacığını kesmek.


"Değer sonsuza ayarlanırsa, sonsuza kadar beklemezsiniz." "Sonsuzluk" un anlamı hakkında tartışma ile ilgili olmadığı sürece, çok uzun süre beklemeniz kesin olabilir. Burada bir dava vardı, burada bir HttpURLConnection.getResponseCode()apprx için asılı idi. süreci yeniden başlatana kadar bir hafta. JVM tarafında belirli bir zaman aşımı ve Linux OS tarafında hiçbir zaman aşımı yoktu.
Tom Fink

Son paragraf doğru değil. Bir bağlantı en fazla yaklaşık bir dakika sonra zaman aşımına uğrar. Ayrı bir iplik tamamen gerekli değildir. Hiç veri yoksa, sonsuza kadar çalışan okumalara sahip olabilirsiniz . Ancak Javadoc, varsayılan bağlantı zaman aşımının sonsuz olması konusunda yanlıştır. Öyle değil.
Lorne Marquis

1
@comeGetSome Bu doğru değil. Giriş için soketi kapatabilirsiniz. Bu, engellenen okumanın akış sonu ile karşılaşmasına neden olur.
Lorne Marquis

@comeGetSome: Ben açık bir HTTP URL bağlantısına başvuru tutan bir iş parçacığı kullanarak bunu uygulamak zorunda kaldı. Adı geçen iş parçacığı bağlantıyı kapattığında, diğer iş parçacığı "java.net.SocketException: Soket kapalı" atar. JDK-8075484'e bunu yaptığım için teşekkür ederim!
fmcato

@comeGetSome Elbette Socket.shutdownInput()elini tutmadan arayabilirsin ? Not: Bu zaman aşımları JVM tarafından değil, TCP tarafından uygulanır.
Lorne Marquis
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.