Ada 3 solusi:
1 Setuju dengan panjang data yang akan dikirim. Misalnya, keepAlive dari http harus bergantung pada Content-Length ini.
2 Atur waktu timeout. Menurut pengalaman saya, ini hanya efektif jika diatur pada level Socket.
Copy kode berikut: Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // Jika tidak ada data selama lebih dari 100 milidetik, buang SocketTimeoutException
3. Setelah pengirim selesai mengirimkan data, tutup koneksi. Ini sangat umum dalam operasi HTTP.
(Bagaimana InputStream menentukan bahwa data telah dibaca)
Terkadang, ketika klien tidak dapat dimodifikasi, situasi pertama hanya akan berlalu. Situasi kedua relatif lebih cocok ketika diblokir, pengecualian akan langsung dilempar. Skenario 3 tidak cocok untuk koneksi yang panjang karena link tidak dapat diinterupsi selama seluruh proses komunikasi, juga tidak dapat ditutup hingga akhir. Sebenarnya ada cara keempat: ketika karakter tertentu dibaca, berhentilah membaca. Misalnya, ketika byebye dibaca, istirahatlah. Tapi ini juga memerlukan perubahan kode klien. Saya memilih kompromi - menetapkan batas waktu:
StringBuilder sb = new StringBuilder();coba { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(String baru(buf, 0, a)); if (a != size) { break; } }} catch (Pengecualian e) {}System.out.println(sb);