Pertanyaan Menetapkan batas waktu untuk operasi soket


Saat saya membuat soket:

Socket socket = new Socket(ipAddress, port);

Ini melempar pengecualian, yang OK, karena alamat IP tidak tersedia. (Variabel tes di mana String ipAddress = "192.168.0.3" dan int port = 300.)

Masalahnya adalah: bagaimana cara mengaturnya ke batas waktu untuk soket itu?

Ketika saya membuat soket, bagaimana saya mengurangi waktu sebelum saya mendapatkan UnknownHostException dan dapatkan soket untuk timeout?


75
2018-02-11 13:51


asal


Jawaban:


Menggunakan Socket() konstruktor, dan connect(SocketAddress endpoint, int timeout) metode sebagai gantinya.

Dalam kasus Anda akan terlihat seperti:

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

Mengutip dari dokumentasi

connect

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

Menghubungkan soket ini ke server dengan nilai batas waktu yang ditentukan. Batas waktu nol ditafsirkan sebagai batas waktu tak terbatas. Sambungan kemudian akan memblokir hingga terbentuk atau kesalahan terjadi.

Parameter:

endpoint - SocketAddress
timeout - nilai waktu habis untuk digunakan dalam milidetik.

Melempar:

IOException - jika terjadi kesalahan selama koneksi
SocketTimeoutException - jika waktu habis sebelum menghubungkan
IllegalBlockingModeException - jika soket ini memiliki saluran terkait, dan saluran berada dalam mode non-blocking
IllegalArgumentException - jika titik akhir null atau subkelas SocketAddress tidak didukung oleh soket ini

Sejak:          1.4


136
2018-02-11 13:54



Anda tidak menetapkan batas waktu untuk soket, Anda menetapkan batas waktu untuk operasi Anda melakukan pada soket itu.

Sebagai contoh socket.connect(otherAddress, timeout)

Atau socket.setSoTimeout(timeout) untuk menetapkan batas waktu aktif read() operasi.

Lihat: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html


40
2018-02-11 13:54



Anda bisa 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 itu membantu!


18
2018-02-11 13:58



Anda tidak dapat mengontrol batas waktu karena UnknownHostException. Ini adalah timing DNS. Anda hanya dapat mengontrol waktu koneksi yang diberikan host yang valid. Tak satu pun dari jawaban sebelumnya yang membahas pokok ini dengan benar.

Tapi saya merasa sulit untuk percaya bahwa Anda benar-benar mendapatkan UnknownHostException ketika Anda menentukan alamat IP daripada nama host.

EDIT Untuk mengontrol timeout DNS Java lihat jawaban ini.


8
2018-03-20 09:12



Menggunakan konstruktor default untuk Socket dan kemudian gunakan menghubungkan () metode.


5
2018-02-11 13:54