2012-12-10 8 views
5

क्या फ़ाइल नाम के साथ सर्वर को फ़ाइल भेजने का कोई आसान तरीका है ताकि सर्वर और क्लाइंट में फ़ाइल नाम बिल्कुल वही हो?QTCPSocket पर फ़ाइल नाम के साथ फ़ाइल कैसे भेजें?

यहाँ मेरी कोड

QString path = QApplication::applicationDirPath()+"/belajardansa.bmp"; 
QFile inputFile(path); 
QByteArray read ; 
inputFile.open(QIODevice::ReadOnly); 
while(1) 
{ 
    read.clear(); 
    read = inputFile.read(32768*8); 
    qDebug() << "Read : " << read.size(); 
    if(read.size()==0) 
     break; 
    qDebug() << "Written : " << socket->write(read); 
    socket->waitForBytesWritten(); 
    read.clear(); 
} 
inputFile.close(); 

रिसीवर

है

भेजने वाले
QTcpSocket* socket = static_cast<QTcpSocket*>(sender()); 
QBuffer* buffer = buffers.value(socket); 

QByteArray read = socket->read(socket->bytesAvailable()); 
qDebug() << "Read : " << read.size(); 

QFile file( ???); // what should I put in the bracket??? 
if(!(file.open(QIODevice::Append))) 
{ 
    qDebug("File cannot be opened."); 
    exit(0); 
} 
file.write(read); 
file.close(); 

उत्तर

5
  1. आप अपनी खुद की डेटा संरचना है कि फ़ाइल की सामग्री और उसके फ़ाइल नाम का प्रतिनिधित्व करते हैं और यह परिवर्तित कर देंगे बना सकते हैं QByteArray और इसके विपरीत।

  2. आप दो अनुरोध भेज सकते हैं: फ़ाइल नाम के साथ पहला और डेटा वाला दूसरा।

+0

आपके जवाब के लिए धन्यवाद हैंक, आपका पहला सुझाव मेरे लिए थोड़ा जटिल है क्योंकि मैं सी ++ और क्यूटी में नौसिखिया हूं। क्या आप मुझे डेटा संरचना को QByteArray में परिवर्तित करने के लिए नमूना कोड दे सकते हैं? आपके दूसरे सुझाव के बारे में, सॉकेट डेटा का केस कैसे करें ताकि सर्वर पहचान सके कि सॉकेट डेटा में फ़ाइल नाम या डेटा है या नहीं। –

5

कोई वास्तव में आसान तरीका नहीं है। आपको अपना खुद का प्रोटोकॉल बनाना होगा। हालांकि, वह प्रोटोकॉल अक्सर बहुत ही सरल प्रोटोकॉल हो सकता है।

अंत, सरल उदाहरण का उपयोग करते हुए QString::toUtf8()

  • लिखें के रूप में द्विआधारी पूर्णांक
  • लिखें QByteArray की लंबाई सॉकेट से QByteArray से बाइट्स फ़ाइल युक्त सॉकेट से QByteArray को

    1. Convert QString फ़ाइल नाम लिखने पर नाम
    2. फ़ाइल की लंबाई को बाइनरी int
    3. फ़ाइल से बाइट्स सॉकेट करने के लिए लिखें
    4. बंद

    पढ़ने अंत में:

    1. फ़ाइल नाम का पढ़ें पूर्णांक कह लंबाई
    2. पढ़ें कि एक QByteArray
    3. Convert फ़ाइल QString को QByteArray से नाम के लिए कई बाइट्स का उपयोग कर QString::fromUtf8()
    4. डेटा की पूर्णांक लंबाई लंबाई पढ़ें
    5. बाइट पढ़ने और फ़ाइल को लिखना जारी रखें जब तक आप मिल गया है कि कई बाइट्स
    6. बंद

    जब लिखने और पढ़ने, अगर आप विभिन्न कंप्यूटरों के बीच बातचीत करना चाहते हैं, तो आप नेटवर्क बाइट क्रम में पढ़ने के बाद बाइट क्रम की मेजबानी के लिए परिवर्तित करना चाहिए लिखने से पहले, और वापस। आप परिभाषित करने का भी निर्णय ले सकते हैं कि आप "x86 बाइट ऑर्डरिंग" का उपयोग करते हैं, और अलग-अलग सीपीयू के साथ डेटा पढ़ने वाले किसी भी व्यक्ति को बदलने के लिए ...

  • +0

    आपके उत्तर हाइड के लिए धन्यवाद, आपका सुझाव कोशिश करने के लिए बहुत उपयोगी लगता है। लेकिन एक नौसिखिया के रूप में मेरे लिए एक समस्या है। आने वाले सॉकेट डेटा का मामला कैसे करें ताकि मैं डेटा को उस प्रोटोकॉल में सही चरण में डाल सकूं। (जैसा कि हम जानते हैं कि कुछ संकुल में भेजे गए टीसीपी लिखित डेटा में।) –

    +0

    टीसीपी/आईपी एक स्ट्रीम प्रोटोकॉल है, आप बाइट्स लिखते हैं और पढ़ते हैं, पैकेट नहीं। यह सभी बाइट्स के आदेश और संचरण की भी गारंटी देता है। तो आप भरोसा कर सकते हैं कि आपको सटीक उसी क्रम में सटीक बाइट्स मिलेंगे (या आपको त्रुटि और डिस्कनेक्शन मिल जाएगा)। यही कारण है कि आपको सॉकेट में अपना खुद का "पैकेट आकार" लिखना चाहिए, क्योंकि टीसीपी/आईपी आपको आकार के साथ पैकेट नहीं देता है, केवल बाइट्स की धारा। – hyde

    +0

    ठीक है अब इसे मिला :) धन्यवाद हाइड। –