Qt/C++echo客户端+python echo服务器存在问题(未收到数据)



我在python中使用这个简单的echo服务器:http://ilab.cs.byu.edu/python/socket/echoserver.html它在python中与客户端协同工作,但我无法将它与用Qt/C++编写的客户端协同工作。他们成功地建立了连接,但他们之间没有发送任何数据。我能够让我的客户端发送数据(出于某种原因,它需要在每次写入后强制刷新套接字),但它仍然不会接收到来自服务器的任何消息。没有启动readyRead(),字节可用性为0。

#include <QDataStream>
#include <QTextStream>
#include <QDebug>
#include "echoclient.h"
EchoClient::EchoClient(QObject *parent) : QObject(parent), serverSocket(new QTcpSocket(this)), networkSession(nullptr)
{
    connect(serverSocket, &QTcpSocket::readyRead, this, &printEcho);
    connect(serverSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
    connect(serverSocket, &QTcpSocket::connected,
            this, [this](){QTextStream(stdout) << "Connection established" << endl; messageLoop();});
    connect(serverSocket, QTcpSocket::disconnected, this, &disconnect);
}
void EchoClient::connectToServer()
{
    serverSocket->connectToHost(serverIP, serverPort);
}
void EchoClient::setIP(const QString &ip)
{
    serverIP = ip;
}
void EchoClient::setPort(quint16 port)
{
    serverPort = port;
}
void EchoClient::sendMessage(const QString &msg)
{
    qDebug() << serverSocket->write(msg.toUtf8());
    qDebug() << serverSocket->isOpen(); // true
    qDebug() << serverSocket->flush(); // true, why do I need it? It should be working without it
    qDebug() << "bytes available: " << serverSocket->bytesAvailable();
}
void EchoClient::disconnect()
{
    QTextStream(stdout) << "Disconnected" << endl;
}
void EchoClient::printEcho() const
{
    QDataStream in(serverSocket);
    in.setVersion(QDataStream::Qt_5_5);
    QString echoMsg;
    in >> echoMsg;
    QTextStream(stdout) << "Echo: " << echoMsg << endl;
}
void EchoClient::displayError(QAbstractSocket::SocketError) const
{
    qDebug("error occured");
}
void EchoClient::messageLoop()
{
    QTextStream(stdout) << "You can enter messages now" << endl;
    QTextStream conin(stdin);
    while (true) {
        QString msg;
        conin >> msg;
        sendMessage(msg);
    }
}

尝试使用tcpdump -i lo port $serverport或类似工具进行调试。如果您从代码中删除flush()函数,并使用nc -l $serverport(或您使用的任何东西)侦听该端口,并尝试将一些数据发送回客户端,会怎么样?

Upd:如果你有也没关系

可用字节为0

您在发送消息后立即呼叫它。您应该在void EchoClient::printEcho() const方法中调用它。

问题是我忘记了Qt是如何工作的。此处:

connect(serverSocket, &QTcpSocket::connected,
            this, [this](){QTextStream(stdout) << "Connection established" << endl; messageLoop();});

我在插槽的末尾调用了messageLoop()。哪个循环。无限期地因此,控制永远不会返回到Qt的EventLoop,并且无法处理新信号。我可能认为,任何新的传入信号都会神奇地中断已经在运行的程序。

最新更新