2011-10-27 6 views
14

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

QTcpSocket t; 
t.connectToHost("127.0.0.1", 9000); 

.. क्या करें मुझे "डेटा" चर के QByteArray भेजने की जरूरत है।

बहुत सराहना की।

उत्तर

20

QTcpSocket के साथ बहुत ही सरल है। शुरू के रूप में आप था ...

void MainWindow::connectTcp() 
{ 
    QByteArray data; // <-- fill with data 

    _pSocket = new QTcpSocket(this); // <-- needs to be a member variable: QTcpSocket * _pSocket; 
    connect(_pSocket, SIGNAL(readyRead()), SLOT(readTcpData())); 

    _pSocket->connectToHost("127.0.0.1", 9000); 
    if(_pSocket->waitForConnected()) { 
     _pSocket->write(data); 
    } 
} 

void MainWindow::readTcpData() 
{ 
    QByteArray data = pSocket->readAll(); 
} 

ध्यान रखें, हालांकि, कि TcpSocket से पढ़ने के लिए आप डेटा एक से अधिक संचरण में, यानी प्राप्त हो सकता है। जब सर्वर आपको स्ट्रिंग "123456" भेजता है तो आपको "123" और "456" प्राप्त हो सकता है। यह जांचना आपकी ज़िम्मेदारी है कि ट्रांसमिशन पूरा हो गया है या नहीं। दुर्भाग्यवश, यह लगभग हमेशा आपकी कक्षा में राज्य के परिणामस्वरूप होता है: कक्षा को याद रखना होता है कि यह किस ट्रांसमिशन की उम्मीद कर रहा है, चाहे वह पहले से शुरू हो चुका है और यदि यह पूरा हो गया है। अब तक, मैंने इसके चारों ओर एक सुंदर तरीका नहीं लगाया है।

+0

बहुत बाध्य रॉबिन, आप डेटा प्राप्त करने के लिए कुछ कोड प्रदान कर सकता है? –

+0

निश्चित रूप से। मैंने तदनुसार अपना जवाब संपादित किया। – Robin

+0

धन्यवाद श्रीमान !! –

5

मेरे मामले में मैं एक्सएमएल डेटा पढ़ रहा था, और कभी-कभी मैं सभी को एक पैकेट में नहीं मिला। यहां एक सुरुचिपूर्ण समाधान है। WaitForReadyRead में इसका समय भी हो सकता है और तब टाइमआउट पहुंचने पर कुछ अतिरिक्त त्रुटि जांच हो सकती है। मेरे मामले में मैं एक अधूरी एक्सएमएल कभी नहीं प्राप्त करना चाहिए, लेकिन अगर ऐसा किया था इस सूत्र अप indefinetly समय समाप्त होने के लॉक होगा:

while(!xml.atEnd()) { 

    QXmlStreamReader::TokenType t = xml.readNext(); 

    if(xml.error()) { 
     if(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError) { 
      cout << "reading extra data" << endl; 
      sock->waitForReadyRead(); 
      xml.addData(sock->readAll()); 
      cout << "extra data successful" << endl; 
      continue; 
     } else { 
      break; 
     } 
    } 
    ... 
+0

अच्छा जवाब। बहुत धन्यवाद आदमी। – Taz742