मैं एक जावा प्रोग्राम है कि, कनेक्शन स्वीकार HTTP अनुरोध प्राप्त करता है और HTTP उत्तर और कुछ डेटा फ़ाइल में संग्रहीत (इस कैशिंग प्रॉक्सी का एक हिस्सा है) भेजता है। सब कुछ अप्रासंगिक निकाला जा रहा है, मेरे कोड इस तरह दिखता है:सॉकेट समापन समस्या - डेटा का अंतिम भाग खो दिया है
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream outputStream = socket.getOutputStream();
byte[] buf = new byte[BUFFER_SIZE];
int len = 0;
while ((len = fileInputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
outputStream.flush();
socket.close();
इस कोड को प्रत्येक जुड़े ग्राहक के लिए विशेष रूप से धागा में मार डाला गया है।
जब मैं छोटी फ़ाइलें (.htm, .gif, .swf, आदि) के साथ सौदा है, सब कुछ ठीक काम करता है (हालांकि, मैं कुछ भी ब्राउज़र में गलत दिखाई नहीं है)। लेकिन जब मैं बड़ी फाइलें (.iso) डाउनलोड करता हूं, विशेष रूप से कई फाइलें, जब सिस्टम लोड हो रहा है, कभी-कभी मुझे वास्तव में अजीब व्यवहार मिलता है। ब्राउज़र में 99.99% फ़ाइल डाउनलोड होती है और जब अनलोड किए गए बाइट्स के BUFFER_SIZE से कम होते हैं, तो कुछ सेकंड के लिए स्टॉप डाउनलोड करते हैं और फिर ब्राउज़र कहता है कि त्रुटि हुई है। मैं नहीं समझ सकता कि क्या होता है, क्योंकि सभी डेटा सफलतापूर्वक पढ़ा जाता है और यहां तक कि सभी डेटा को सफलतापूर्वक outputStream लिखा है। जैसा कि आप देख सकते हैं, मैं फ्लश() भी करता हूं, लेकिन इसका कोई परिणाम नहीं होता है।
क्या कोई मुझे बता सकता है कि क्या होता है?
संपादित
अपलोड की गई परियोजना filehosting.org करने के लिए।
Download source files। स्रोत कोड, Build.xml और Readme.txt के साथ ज़िप संग्रह है। समाधान बनाने के लिए चींटी का प्रयोग करें। ClientManager.java में वर्णित समस्या होती है, आपको वहां एक टिप्पणी मिल जाएगी।
हो सकता है कि हम कुछ अप्रासंगिक देखने की जरूरत है। –
सत्य कहने के लिए, मैंने केवल लॉगिंग और इनलाइन विधि कॉल को हटा दिया है। – levanovd
क्या आप अपने HTTP प्रतिक्रिया शीर्षकों में 'सामग्री-लंबाई' सेट कर रहे हैं? यदि हां, तो आप इसे किस पर सेट कर रहे हैं? –