无法使用qt建立双向通信

时间:2013-05-13 11:15:21

标签: qt sockets

我使用qt的QTcpSocket和QTcpServer类来建立双向通信。我能够从客户端向服务器发送数据。但我没有得到服务器的响应,即我的client.cpp从不触发readyRead()信号。我已经使用Wireshark检查过我的服务器数据是否在指定的端口中可用。

我发布了我的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" ;
    }

2 个答案:

答案 0 :(得分:2)

看起来这里有forever循环。这意味着,在您致电Qt后,您的eventloopstartTransfer()永远无法取回控制权。如果用无限循环阻塞执行线程,你认为Qt应该如何运行startRead()代码?

答案 1 :(得分: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();
}
}