Saat saya membuat soket:
Socket socket = new Socket(ipAddress, port);
Ini melontarkan pengecualian, yang tidak masalah, karena alamat IP tidak tersedia. (Variabel uji dimana String ipAddress = "192.168.0.3"
dan int port = 300
.)
Masalahnya adalah: bagaimana cara mengaturnya ke batas waktu untuk soket itu?
Saat saya membuat soket, bagaimana cara mengurangi waktu sebelum saya mendapatkan UnknownHostException
dan mendapatkan soket ke waktu habis?
Jawaban:
Gunakan
Socket()
konstruktor , danconnect(SocketAddress endpoint, int timeout)
metode sebagai gantinya.Dalam kasus Anda, ini akan terlihat seperti:
Socket socket = new Socket(); socket.connect(new InetSocketAddress(ipAddress, port), 1000);
Mengutip dari dokumentasi
sumber
socket.setSoTimeout(timeoutMillis)
waktu tunggu selama pemblokiran operasi IO.Anda tidak menetapkan batas waktu untuk soket, Anda menetapkan batas waktu untuk operasi yang Anda lakukan pada soket itu.
Sebagai contoh
socket.connect(otherAddress, timeout)
Atau
socket.setSoTimeout(timeout)
untuk mengatur waktu tunggu padaread()
operasi.Lihat: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
sumber
socket.setSoTimeout
harus dipanggil SETELAHconnect
, atau itu tidak akan berpengaruh dan pembacaan tidak akan pernah habis. ini adalah salah satu gotcha yang didokumentasikan dengan buruk.Anda dapat menggunakan solusi berikut:
SocketAddress sockaddr = new InetSocketAddress(ip, port); // Create your socket Socket socket = new Socket(); // Connect with 10 s timeout socket.connect(sockaddr, 10000);
Semoga membantu!
sumber
connect()
metode, tetapi tidak di bawah kendali batas waktu.Anda tidak dapat mengontrol waktu tunggu karena
UnknownHostException
. Ini adalah pengaturan waktu DNS. Anda hanya dapat mengontrol waktu tunggu koneksi yang diberikan host yang valid. Tak satu pun dari jawaban sebelumnya membahas hal ini dengan benar.Tetapi saya merasa sulit untuk percaya bahwa Anda benar-benar mendapatkan
UnknownHostException
ketika Anda menentukan alamat IP daripada nama host.EDIT Untuk mengontrol batas waktu DNS Java, lihat jawaban ini .
sumber
Gunakan konstruktor default untuk Socket dan kemudian gunakan metode connect () .
sumber