Qt/C++ echo client + python echo server的问题(没有收到数据)

Posted

技术标签:

【中文标题】Qt/C++ echo client + python echo server的问题(没有收到数据)【英文标题】:Problems with Qt/C++ echo client + python echo server (no data received) 【发布时间】:2015-11-12 22:27:55 【问题描述】:

我在 python 中使用这个简单的回显服务器:http://ilab.cs.byu.edu/python/socket/echoserver.html 它适用于 python 中的客户端,但我无法使用我用 Qt/C++ 编写的客户端来使用它。 他们成功建立连接,但他们之间没有数据发送。 我能够让我的客户端发送数据(由于某种原因,它需要在每次写入后强制刷新套接字),但它仍然没有收到来自服务器的任何消息。没有 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);
    

【问题讨论】:

你确定你的Python服务器支持QDataStream使用的格式吗? 不应该只是字节流吗?而且,就像我说的,我设法让服务器从客户端接收消息(通过刷新)。即使由于某种原因格式有问题 - 它应该只是输出垃圾。但是相反,一方面它说发送了一些字节,但另一方面(客户端) - 它从未被接收到。它消失了。我认为这个问题可能与flush()类似,但是python没有flush方法,并且使用python客户端它可以正常工作,所以这里肯定有问题。 【参考方案1】:

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

更新:如果你得到就可以了

bytesAvailable 为 0

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

【讨论】:

忘了说我在 WINDOWS 上。在 printEcho() 中调用它是没有意义的,因为这个方法永远不会被触发(它永远不会打印“Echo:”)。无论我发送多少条消息,bytesavailable 都是 0。【参考方案2】:

问题在于我忘记了 Qt 是如何工作的。这里:

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

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

【讨论】:

以上是关于Qt/C++ echo client + python echo server的问题(没有收到数据)的主要内容,如果未能解决你的问题,请参考以下文章

zabbix-client-install

如何使用django restfulframework 实现文件上传

WebRTC笔记之十九:基于WebSocketPP的TLS客户端和服务器

WebRTC笔记之十九:基于WebSocketPP的TLS客户端和服务器

WSUS客户端自动安装脚本

Laravel echo 未收到事件