2011-10-27 37 views
14

Tôi mới sử dụng QT .. Tôi muốn kết nối với máy chủ nghe và truyền tải một số dữ liệu. Tôi nhìn vào các ví dụ có sẵn nhưng họ dường như có chức năng bổ sung mà dường như không phải là rất hữu ích cho tôi (kết nối, tài, vv ..)Máy khách TCP TCP đơn giản nhất

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

Giả sử server đang lắng nghe và mạnh mẽ .. gì Tôi cần phải gửi QByteArray của biến "dữ liệu".

Được đánh giá cao.

Trả lời

20

rất đơn giản với QTcpSocket. Bắt đầu như bạn đã làm ...

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(); 
} 

Xin lưu ý rằng, để đọc từ TcpSocket bạn có thể nhận dữ liệu trong nhiều lần truyền, tức là. khi máy chủ gửi cho bạn chuỗi "123456", bạn có thể nhận được "123" và "456". Bạn có trách nhiệm kiểm tra xem việc truyền tải có hoàn tất hay không. Thật không may, điều này hầu như luôn luôn kết quả trong lớp học của bạn là nhà nước: các lớp học phải nhớ những gì nó đang mong đợi truyền tải, cho dù nó đã bắt đầu đã và nếu nó hoàn thành. Cho đến nay, tôi đã không tìm ra một cách thanh lịch xung quanh đó.

+0

nhiều nghĩa vụ Robin, bạn có thể cung cấp một số mã để tiếp nhận dữ liệu? –

+0

Chắc chắn. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. – Robin

+0

Cảm ơn ngài !! –

5

Trong trường hợp của tôi, tôi đã đọc dữ liệu xml và đôi khi tôi sẽ không nhận được tất cả trong một gói. Đây là một giải pháp thanh lịch. WaitForReadyRead cũng có thể có một thời gian trong nó và sau đó kiểm tra thêm một số lỗi trong trường hợp thời gian chờ đạt được. Trong trường hợp của tôi, tôi không bao giờ nên nhận được một xml không đầy đủ, nhưng nếu nó đã xảy ra điều này sẽ khóa thread lên indefinetly mà không cần thời gian chờ:

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

câu trả lời hay. cảm ơn nhiều người đàn ông. – Taz742

Các vấn đề liên quan