2011-10-31 27 views
10

Basit bir sunucu istemci uygulamasına sahibim. Her şey çalışıyor, ancak bir aşamada sunucudan yanıt almak için 5 dakikadan fazla sürüyor (normal ve bunun böyle olması gerekiyor). Sorun şu ki, 5 dakikadan fazla sürerse bu istisnayı almaya devam ediyorum: java.net.SocketTimeoutException: Read timed out.Java, yuva zaman aşımını arttırın

Windows veya Java sanal makinesinde bazı varsayılan yuva zaman aşımı olup olmadığını merak ediyordum? İstemci kodunu değiştiremiyorum, bu yüzden setSoTimeout() benim için bir seçenek değil. Windows XP kullanma

..

DÜZENLEME: şimdi anladım gibi soket bağlantısı istemci tarafında açılan olmamasıdır. Sunucudan geçti. Bu yüzden, sunucu kavanoz dosyasını bütünüyle çözdüm. Ama hala zaman aşımı hakkında bir şey bulamıyorum.

+0

Zaman aşımının Sistem özellikleri kullanılarak yapılandırılıp yapılandırılmadığını kontrol edin. – JimmyB

+0

@HannoBinder, Sistem özelliklerinin ne anlama geldiğini açıklayabilir mi? – hs2d

+0

[sun.net.client.defaultReadTimeout] (http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html) gibi bir şeyi veya müşterinizin isteğine göre ne olabilir bağlanma – JimmyB

cevap

10

Varsayılan yuva zaman aşımı 0'dır, bu da hiçbir zaman zaman aşımı anlamına gelir. Eğer 5 dakika sonra gerçekten zaman aşımına uğrarsa, bu kod içinde ayarlanmış demektir. Kaynak kullanılamıyorsa ve bir yapılandırma yoksa, sınıfı ayıklamaya çalışabilir ve setSoTimeout çağrılarını arayabilirsiniz.

Yorumlar ve aramaların setSoTimeout() çağrılarını bulamadığı gerçeği nedeniyle, farklı bir yaklaşım kullanabilirsiniz. Sadece zaman aşımına uğrayın ve eğer olması durumunda aramayı yeniden deneyecek küçük bir senaryo yazınız. İstemcinizi komut satırından arayabilirseniz, stderr'e devam ederse, çıktıyı ayrıştırabilirsiniz.

+0

"setSoTimeout" çağrılarını derledim ve aradım ama hiçbir şey bulamadım. O zaman başka bir yere mi ayarlanmalı? Canlı paket ile – hs2d

8

Kullanılmayan TCP bağlantısını herhangi bir trafik olmadan uzun süre açık tutmanız önemsiz değildir. Birçok güvenlik duvarı/yönlendirici, bazı zaman aşımlarından sonra kullanılmayan bağlantı noktalarını kapatır.

Tek bir seçenek, her zaman ve sonra da kukla paketler göndermek için basit saklayıcı protokolü uygulamak olabilir, ancak istemci koduna dokunamazsanız, bu muhtemelen bir seçenek değildir.

Düzenleme: İstemci kodunda setSoTimeout() öğesini geçersiz kılmanın herhangi bir yolunun farkında değilim.

+0

çok iyi bir fikir! – benez

+0

@benez Katılmıyorum. Yöneltici, bağlantıyı bu kadar değerli bir kaynak olarak görüyorsa, zaman aşımına uğramasını engelleyen herhangi bir işiniz yoktur. Her halükarda yine de bağlantı kayıplarıyla uğraşmak zorunda kalırsınız. Kalıcı pingler eklemek gerçekten de boyundaki anlamsız bir acıdır. – EJP

+0

@EJP Bağlantı kayıplarını işlemek için henüz uygun bir uygulama görmedim. Gerçek zamanlı güncellemeleri beklediğiniz durumlar vardır ve verilerinizi senkronize halde tutmak için sürekli bağlı iki tarafa ihtiyacınız vardır. Bağlantı kayıpları basit bir yeniden bağlanma ile basitçe ele alınmaz. Önemli bir mesajı kaçıracak veya geç kalmayacaksınız. Örneğin. Borsalar her zaman kalp atışı gönderir ve irc protokolü pong ile bir ping'e cevap vermenizi gerektirir. ve evet bağlantı kayıplarıyla uğraşmak zorundasınız, ancak bazı programlarda bunlardan kaçınmak isteyebilirsiniz. – benez

0

0 varsayılan zaman aşımı oldukça doğru değil. Örneğin, Axis2 istemcisi varsayılan 60 saniyelik zaman aşımına sahip olduğundan, bu nedenle çağrı yapmak için ne tür bir uygulama kullandığınıza bağlı olacaktır.

Daha fazla bilgi verebilir misiniz? Cevaplar bölümünde yazdığım için özür dilerim ama yorum yapmak için yeterli itibarım yok :)

+0

Buradaki koda baktığımda sadece 'java.io.InputStream' görebiliyorum. Yani bağlantı sunucudan istemciye yapılmalı mı? – hs2d

+0

iyi, evet, Java için varsayılan değer sonsuzdur, ancak bir kitaplık bunu değiştirebilir. Belki bir ipucu, hs2d, herhangi bir kavanoz var mı? Ya da belki, farklı bir yaklaşım atabilirsiniz, sadece zaman aşımına uğrayın ve başarısız olursa tekrar deneyin. – stivlo

0

Bağlantıyı canlı tutmaya mı gerek var? Neden bunu daha asenkronize etmek için tekrar düşünmüyorsun. Bu şema hiç ölçeklemiyor. Bir noktada mevcut tüm iş parçacıklarınız sunucudan uzun bir süre yanıt bekleyebilir.

+0

Eğer okumak isterse bağlantıyı canlı tutmaya ihtiyacı var. Tüm bunların başını veya kuyruğunu yapamazsın. – EJP

İlgili konular