【问题标题】:unable to establish two way communication using qt无法使用 qt 建立双向通信
【发布时间】:2014-01-22 19:21:42
【问题描述】:

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

【问题讨论】:

  • 请添加服务器代码:创建QTcpServer,使用QTcpSocket等
  • 为什么你有一个永远的循环?
  • 顺便说一句,没有睡眠的循环将使 CPU 使用率达到 100%,您应该重新考虑您的架构(例如将所有内容移动到线程并使用 QThread::sleep)。
  • @Amartel 不会有 100% 的 CPU 使用率,因为那里的永远循环内有来自 stdin 的读取。 =)
  • @JustAnotherCurious 我的错误 - 不专心地阅读代码。

标签: qt sockets


【解决方案1】:

看起来你在这里有forever 循环。这意味着您的Qt main eventloop 在您调用startTransfer() 后永远不会重新获得控制权。如果你用无限循环阻塞你的执行线程,你认为Qt应该如何运行startRead()代码?

【讨论】:

  • 非常感谢。我改变了我的架构,现在它工作正常。我是编码新手,从没想过永远循环可能会阻止进一步的执行。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多