Soket işlemleri için bir zaman aşımı ayarlama


87

Bir soket oluşturduğumda:

Socket socket = new Socket(ipAddress, port);

IP adresi mevcut olmadığı için sorun olmayan bir istisna atar. (Test değişkenleri nerede String ipAddress = "192.168.0.3"ve int port = 300.)

Sorun şudur: bu soket için zaman aşımına nasıl ayarlayabilirim?

Soketi oluşturduğumda, bir soket UnknownHostExceptionalıp soketi zaman aşımına almadan önce süreyi nasıl kısaltabilirim ?


10
@adrianboimvaser: Bu durumda, bir kopya olarak işaretlemeli ve kopyayı işaret eden bir yorum bırakmalısınız, böylece bir moderatör onu kapatabilir (bu yorumu bir yıl önce bırakmışsınız - belki de şimdiye kadar biliyorsunuzdur). Şimdi bunu yapmak için oyumu verirdim, ama kopyanın nerede olduğu hakkında hiçbir fikrim yok!
Tom Anderson

1
Yıllar geç cevap verme eğilimine devam etmek için, @EJP, bu sorunun başlığı, önerdiğiniz kopyadan çok daha az belirsiz
Isaac,

@Isaac Ve aslında bir kopya değil, yorum geri çekildi.
user207421

(Not: Başlığı daha az belirsiz olacak şekilde ayarladım.)
Stephen C

Yanıtlar:


167

Kullanım Socket()yapıcı ve connect(SocketAddress endpoint, int timeout)yöntem yerine.

Sizin durumunuzda şuna benzer:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

Belgelerden alıntı yapmak

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

Bu soketi, belirli bir zaman aşımı değeri ile sunucuya bağlar. Sıfır zaman aşımı, sonsuz bir zaman aşımı olarak yorumlanır. Bağlantı, daha sonra kurulana veya bir hata oluşana kadar engellenecektir.

Parametreler:

endpoint - SocketAddress
timeout - milisaniye cinsinden kullanılacak zaman aşımı değeri.

Atar:

IOException- bağlantı sırasında bir hata oluşursa
SocketTimeoutException- bağlanmadan önce zaman aşımı sona ererse
IllegalBlockingModeException- bu soket ilişkili bir kanala sahipse ve kanal engellemesiz moddaysa
IllegalArgumentException- uç nokta boşsa veya bu soket tarafından desteklenmeyen bir SocketAddress alt sınıfı ise

Beri: 1.4


4
Bu, ConnectException için zaman aşımını azaltabilir (ancak artırmaz) ve OP'nin aldığını iddia ettiği UnknownHostException zaman aşımı üzerinde hiçbir etkisi yoktur (buna inanmıyorum). Ayrıca Javadoc'un varsayılanın sonsuz olduğunu belirtirken yanlış olduğuna dikkat edin. Değil. Platformun yaklaşık bir dakikalık varsayılan zaman aşımı vardır ve bu artırılamaz.
user207421

3
4 yıl sonra bile bu yardımcı oldu, kabul edilen cevap bu olmalı.
Sharp Edge

4
Şimdi 5 yıl sonra ve internette bulduğum en iyi cevap bu .. Teşekkürler
MBH

1
socket.setSoTimeout(timeoutMillis)GÇ işlemlerini engelleme sırasında zaman aşımı çağrısı yapmak da önemlidir .
Gray

43

Soket için bir zaman aşımı ayarlamazsınız, işlemler için bir zaman aşımı ayarlarsınız , o soket üzerinde gerçekleştirdiğiniz .

Örneğin socket.connect(otherAddress, timeout)

Veya socket.setSoTimeout(timeout)bir zaman aşımı ayarlamak içinread() işlemlerde .

Bakınız: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html


Peki, bu durumda bu aynı zamanda bağlanan bir operasyondur. Durum böyle görünse de bu ctor'un sonsuz bir zaman aşımı kullandığını belirten bir yer bulamıyorum.
sandos

3
@sandos Connect () için Javadoc'ta açıkça belirtilmiştir. Ancak aynı zamanda yanlıştır. Varsayılan zaman aşımı, sonsuz değil, platform zaman aşımıdır ve yalnızca bu connect () yöntemiyle azaltılabilir, artırılamaz.
user207421

not, socket.setSoTimeoutSONRA çağrılmalıdır connect, yoksa hiçbir etkisi olmaz ve okumalar asla zaman aşımına uğramaz. bu, yetersiz belgelenmiş bir sorun.
pstanton

19

Aşağıdaki çözümü kullanabilirsiniz:

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

Umarım yardımcı olur!


1
İddia ettiği gibi, bir UnknownHostException alıyorsa, bu, etkin bir değiştirilmiş zaman aşımının olmadığı ilk satırda gerçekleşir.
user207421

Ancak, ilk satır herhangi bir istisna oluşturmaz. Dokümantasyondan: "Ana bilgisayar adını bir InetAddress olarak çözmek için bir girişimde bulunulacak. Bu girişim başarısız olursa, adres çözülmemiş olarak işaretlenecek"
ady

Bu durumda, yöntemle çözülecektir connect(), ancak zaman aşımının kontrolü altında olmayacaktır.
user207421

8

Nedeniyle zaman aşımını kontrol edemezsiniz UnknownHostException. Bunlar DNS zamanlamalarıdır. Yalnızca geçerli bir ana bilgisayar verildiğinde bağlantı zaman aşımını kontrol edebilirsiniz. Önceki cevapların hiçbiri bu noktayı doğru şekilde ele almıyor.

Ancak UnknownHostException, bir ana bilgisayar adı yerine bir IP adresi belirlediğinizde gerçekten bir aldığınıza inanmakta zorlanıyorum .

DÜZENLE Java'nın DNS zaman aşımlarını kontrol etmek için bu yanıta bakın .


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.