पर ब्लूटूथ पर बड़ी मात्रा में डेटा स्थानांतरित करना मैं एक एंड्रॉइड फोन से दूसरे समय में मनमाने ढंग से डेटा के मेगाबाइट के बारे में स्थानांतरित करने की कोशिश कर रहा हूं। वर्तमान में, से OutputStream
के आसपास BufferedOutputStream
के आस-पास DataOutputStream
पर आकार, एक कमांड कोड और डेटा लिखता है।एंड्रॉइड जिंजरब्रेड
प्राप्त करने वाला फ़ोन आकार और कमांड कोड पढ़ता है और फिर इनपुट स्ट्रीम से तब तक पढ़ता है जब तक कि वह सभी डेटा प्राप्त नहीं कर लेता है। यह छोटे तारों के लिए काम करता है, लेकिन बड़ी फ़ाइलों के लिए सभी डेटा स्थानांतरित नहीं किया जाता है। डीबगर में ऐप चलाने से पता चलता है कि बिना किसी अपवाद के लिखने का रिटर्न और पठन अपेक्षित बाइट्स का एक अंश पढ़ता है और फिर अनिश्चित काल तक ब्लॉक करता है। यह किसी भी अपवाद को फेंक नहीं देता है।
क्या वहां कोई बफर भर रहा है जो भर रहा है? क्या यह सुनिश्चित करने के लिए मुझे कुछ और करने की ज़रूरत है कि सभी डेटा स्थानांतरित हो जाए?
प्रेषक और प्राप्तकर्ता के लिए मेरे कोड में नीचे हैं:
प्रेषक:
try {
DataOutputStream d = new DataOutputStream(new BufferedOutputStream(mmOutStream,buffer.length+8));
//int b= buffer.length;
d.writeInt(buffer.length);
d.writeInt(command);
d.write(buffer);
d.flush();
} catch (IOException e) {
Log.e(TAG, "Exception during write", e);
}
}
रिसीवर:
try {
// Read from the InputStream
int messageSize= inStream.readInt();
int messageCode = inStream.readInt();
bytes=0;
buffer =new byte[messageSize];
while(bytes < messageSize)
{
bytes += inStream.read(buffer,bytes,messageSize - bytes);
}
message = bytes;
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
ब्लूटूथ भेजें बफर ब्लूटूथ सॉकेट मूल कोड (मेरी प्रतिलिपि में) 70 कीबी है। इसके अलावा, लिनक्स आंतरिक रूप से इसे दोगुना करता है ("कर्नेल डेटा संरचनाओं" के कारण)। हालांकि, यह एक समस्या नहीं होनी चाहिए क्योंकि 'लिखना (3)' इसे प्रबंधित करना चाहिए। इसके अलावा, फ्लश कुछ भी नहीं कर सकता है (क्योंकि लेखन तुल्यकालिक लगता है) और यह (फ्लश) ओवरराइट नहीं किया गया है। – yingted