2013-05-13 2 views
0

Я использовал QTcpSocket и QTcpServer класс qt для установления двусторонней связи. Я могу отправлять данные с клиента на сервер. Но я не получаю ответ от сервера. I.e клиент.cpp никогда не запускает readyRead(). Я проверил использование Wireshark, что мои данные с сервера доступны в указанном порту.не удалось установить двустороннюю связь с использованием qt

Я отправляю мой client.cpp код (Пожалуйста, помогите):

Client::Client(QObject* parent): QObject(parent) 
{ 
    socket = new QTcpSocket(this); 
    connect(socket, SIGNAL(connected()), 
      this, SLOT(startTransfer())); 
    connect(socket, SIGNAL(readyRead()),this, SLOT(startRead())); 
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), 
      this, SLOT(socketError(QAbstractSocket::SocketError))); 


} 

Client::~Client() 
{ 
    socket->close(); 
} 

void Client::start(QString address, quint16 port) 
{ 
    addr.setAddress(address); 
    socket->connectToHost(addr,port,QTcpSocket::ReadWrite); 
} 

void Client::startTransfer() 
{ 
    printf("Connection established.\n"); 
    char buffer[1024]; 
    forever 
    { 
    printf(">> "); 
    gets(buffer); 
    int len = strlen(buffer); 
    buffer[len] = '\n'; 
    buffer[len+1] = '\0'; 
    socket->write(buffer); 
    socket->flush(); 

} 
} 

void Client::startRead() 
{ 
    cout<<"inside startRead()<<endl"; 
    while(socket->canReadLine()) 
     { 
     QByteArray ba = socket->readLine(); 
     if(strcmp(ba.constData(), "!exit\n") == 0) 
     { 
     socket->disconnectFromHost(); 
     break; 
     } 
     printf(">> %s", ba.constData()); 
} 
} 

void Client::socketError(QAbstractSocket::SocketError) 
    { 
    qDebug()<<"error" ; 
    } 
+0

Пожалуйста, добавьте код сервера: создание QTcpServer, используя QTcpSocket и т.д. – Amartel

+1

Почему у вас есть навсегда петлю там? – thuga

+0

BTW, цикл без сна сделает использование процессора 100%, вы должны переосмыслить свою архитектуру (например, переместите все в поток и используйте 'QThread :: sleep'). – Amartel

ответ

2

Похоже, у вас есть forever цикл здесь. Это означает, что ваш Qt главный eventloop никогда не получает контроль после того, как вы позвоните startTransfer(). Как вы думаете, Qt должен запускать код startRead(), если вы блокируете поток выполнения с помощью бесконечного цикла?

+0

спасибо тонну. Теперь я изменил свою архитектуру и ее работу. Я новичок в кодировании и никогда не думал, что цикл forever может блокировать дальнейшее выполнение. – baibhavk

0

Для Amartel добавления кода сервера:

Server::Server(QObject* parent): QObject(parent) 
{ 
// cout << "Before connect" << endl; 
    connect(&server, SIGNAL(newConnection()), 
    this, SLOT(acceptConnection())); 

    cout << "Listening.." << endl; 
    server.listen(QHostAddress::Any, 9999); 
// cout << "Server started.." << endl; 
} 

Server::~Server() 
{ 
    server.close(); 
} 

void Server::acceptConnection() 
{ 
// cout << "In acceptConnection" << endl; 
    client = server.nextPendingConnection(); 

    connect(client, SIGNAL(readyRead()), 
    this, SLOT(startRead())); 
} 

void Server::startRead() 
{ 
    while(client->canReadLine()) 
     { 
     QByteArray ba = client->readLine(); 
     if(strcmp(ba.constData(), "!exit\n") == 0) 
     { 
     client->disconnectFromHost(); 
     break; 
     } 
     printf(">> %s", ba.constData()); 

     int result = 0; 
     bool ack = true; 

     result = client->write("I Reached"); 
     cout<<result<<endl; 
     if(result <= 0) 
     qDebug("Ack NOT sent to client!!!"); 
     else 
     qDebug("Ack sent to client."); 
     // client->write("I Reached"); 
     client->flush(); 
} 
} 
Смежные вопросы