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

Qt/C++echo客户端+python echo服务器出现问题(未收到数据),python,c++,qt,sockets,network-programming,Python,C++,Qt,Sockets,Network Programming,我在python中使用这个简单的echo服务器: 它与python中的客户机一起工作,但我无法将它与用Qt/C++编写的客户机一起发送到wotk。 它们成功地建立了连接,但它们之间没有发送数据。 由于某种原因,我可以让我的客户机发送数据,每次写入后都需要强制刷新套接字,但它仍然无法从服务器接收任何消息。未激发readyRead,bytesAvailable为0 #include <QDataStream> #include <QTextStream> #include &

我在python中使用这个简单的echo服务器: 它与python中的客户机一起工作,但我无法将它与用Qt/C++编写的客户机一起发送到wotk。 它们成功地建立了连接,但它们之间没有发送数据。 由于某种原因,我可以让我的客户机发送数据,每次写入后都需要强制刷新套接字,但它仍然无法从服务器接收任何消息。未激发readyRead,bytesAvailable为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-ilo-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,并且无法处理新的信号。我可能认为任何新的传入信号都会神奇地中断已经运行的程序。

您确定您的Python服务器支持QDataStream使用的格式吗?它不应该只是字节流吗?而且,正如我所说,我设法让服务器通过flush接收来自客户端的消息。即使出于某种原因,格式有问题,它也应该输出垃圾。但是,相反,在一端,它表示发送了一定数量的字节,但在另一端,它从未被接收。它消失了。我认为这个问题可能与flush-one类似,但是python没有flush方法,而且python客户端工作正常,所以这里肯定有问题。忘了提到我在WIndows上。在printEcho中调用它没有意义,因为此方法从未触发。它从未打印Echo:。无论我发送多少条消息,bytesavailable都是0。