هناك 3 حلول:
1 وافق على طول البيانات التي سيتم إرسالها، على سبيل المثال، يجب أن يعتمد موقع keepAlive الخاص بـ http على طول المحتوى هذا.
2. اضبط المهلة وفقًا لخبرتي، فهي فعالة فقط إذا تم ضبطها على مستوى المقبس.
انسخ الكود كما يلي: مقبس المقبس = جديد المقبس (المضيف، المنفذ)؛
المقبس.setSoTimeout(100); // إذا لم تكن هناك بيانات لأكثر من 100 مللي ثانية، فقم بطرحocketTimeoutException
3. بعد انتهاء المرسل من إرسال البيانات، قم بإغلاق الاتصال. وهذا أمر شائع جدًا في عمليات HTTP.
(كيف يحدد InputStream أن البيانات قد تمت قراءتها)
في بعض الأحيان، عندما لا يمكن تعديل العميل، فإن الموقف الأول سوف يمر فقط، أما الوضع الثاني فهو أكثر ملاءمة نسبيًا، وسيتم طرح الاستثناء مباشرة. السيناريو 3 غير مناسب للاتصالات الطويلة لأنه لا يمكن مقاطعة الارتباط أثناء عملية الاتصال بأكملها، ولا يمكن إغلاقه حتى النهاية. في الواقع، هناك طريقة رابعة: عند قراءة أحرف معينة، توقف عن القراءة، على سبيل المثال، عند قراءة وداعا، توقف. ولكن هذا يتطلب أيضًا تغيير رمز العميل. لقد اخترت حلاً وسطًا - تحديد مهلة:
StringBuilder sb = new StringBuilder();try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, a)); if (a!= size) {break } }} Catch (Exception e) {}System.out.println(sb);