มี 3 วิธีแก้ไข:
1 ยอมรับความยาวของข้อมูลที่จะส่ง เช่น KeepAlive ของ http จะต้องอาศัย Content-Length นี้
2 ตั้งเวลาหมดเวลา ตามประสบการณ์ของฉัน จะมีผลเฉพาะเมื่อตั้งไว้ที่ระดับซ็อกเก็ตเท่านั้น
คัดลอกรหัสดังนี้: Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // หากไม่มีข้อมูลเกิน 100 มิลลิวินาที ให้โยน SocketTimeoutException
3. หลังจากที่ผู้ส่งส่งข้อมูลเสร็จแล้ว ให้ปิดการเชื่อมต่อ นี่เป็นเรื่องปกติมากในการดำเนินการ HTTP
(InputStream กำหนดได้อย่างไรว่าข้อมูลถูกอ่านแล้ว)
บางครั้งเมื่อไม่สามารถแก้ไขไคลเอนต์ได้ สถานการณ์แรกก็จะผ่านไปเท่านั้น สถานการณ์ที่สองจะค่อนข้างเหมาะสมกว่า เมื่อถูกบล็อก ข้อยกเว้นจะถูกส่งออกไปโดยตรง สถานการณ์ที่ 3 ไม่เหมาะสำหรับการเชื่อมต่อที่ยาวนาน เนื่องจากลิงก์ไม่สามารถถูกขัดจังหวะในระหว่างกระบวนการสื่อสารทั้งหมด และไม่สามารถปิดการทำงานจนสิ้นสุดได้ ในความเป็นจริง มีวิธีที่สี่: เมื่ออ่านอักขระบางตัวแล้ว ให้หยุดอ่าน ตัวอย่างเช่น เมื่ออ่านบายบาย ให้หยุดอ่าน แต่สิ่งนี้ยังต้องเปลี่ยนรหัสลูกค้าด้วย ฉันเลือกการประนีประนอม - ตั้งเวลาหมดเวลา:
StringBuilder sb = new StringBuilder();ลอง { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, ก)); if (a != size) { break; } }} catch (ข้อยกเว้น e) {}System.out.println(sb);