0

我已经使用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" ;
    }
4

2 回答 2

2

看起来你在forever这里有循环。这意味着您的Qtmaineventloop在您调用startTransfer(). 如果你用无限循环阻塞你的执行线程,你认为Qt应该如何运行代码?startRead()

于 2013-05-13T12:11:04.163 回答
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();
}
}
于 2013-05-14T06:01:19.067 回答