2010-04-14 17 views
7

Socket numaralı telefondan elde ettiğim bir DataInputStream var. dis.read(...) için zaman aşımı ayarlayabileceğim herhangi bir yol var mı? Şu anda okumak için yeni bir konu ürettim. Üst iş parçacığı, kesintiye uğramadan önce beklemek için thread.join(timeout) yapar. Nio'nun farkındayım, ama bu noktada o kadar çok şey tekrar düşünmek istemiyorum. Teşekkürler.Bir InputStream'in read() işlevi için zaman aşımı ayarlayabilir miyim?

cevap

14

Genellikle InputStream üzerinde değil, ancak soketin kendisindeki tüm okuma işlemleri için bir zaman aşımı ayarlamak üzere Socket#setSoTimeout(int)'u kullanabilirsiniz.

+1

Ah teşekkürler, onu özledim. Benim tek takip soru şudur: Bu kez, her defasında(), birden çok kez okunabilen() çağrılır. Tüm zaman aşımı süresini ayarlayabileceğim bir yol var mıdır, öyle ki her bir okuma() toplamı zaman aşımını aşarsa zaman aşımı olur mu? – Zombies

+0

Otomatik olarak değil, ancak gerçek zaman aşımınızdan daha kısa bir S0-zaman aşımı ayarlayabilirsiniz ve izin verilen toplam çalışma sürenizi aştıysanız bir döngüde kontrol edebilirsiniz. – jarnbjo

+4

Soket zaman aşımı ve DataInputStream birlikte (ve ayrıca bir BufferredInputStream) kullanmaya dikkat edin. Bunlar geçici belleğe bazı verileri ayıracak veya okuyacaktır (getLong() içinde olduğu gibi) ve zaman aşımı gerçekleşirse (soketten daha fazla veri beklerken), önceden okunan verilerden herhangi birini kaybedersiniz ve * kurtarmanın bir yolu yoktur * . SocketTimeoutException, zaman aşımından önce başarıyla aktarılan bayt sayısını sağlayan InterruptedIOException öğesini genişletir. Bir ham soket ile bunu tekrar denemek/devam ettirmek için kullanabilirsiniz (belki de kötü mesajı yıkamak için). –

İlgili konular