簡體   English   中英

Qt / C ++回顯客戶端+ python回顯服務器出現問題(未接收到數據)

[英]Problems with Qt/C++ echo client + python echo server (no data received)

我在python中使用了這個簡單的回顯服務器: http ://ilab.cs.byu.edu/python/socket/echoserver.html它可以在python中與客戶端一起使用,但是我無法通過編寫客戶端將其傳遞給wotk在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);
    }
}

嘗試使用tcpdump -i lo port $serverport或類似tcpdump -i lo port $serverport調試它。 如果您從代碼中刪除flush()函數,並使用nc -l $serverport (或您使用的任何端口)在該端口上偵聽,然后嘗試將一些數據發送回客戶端怎么辦?

Upd:沒關系,沒關系

bytesAvailable為0

您在發送消息后立即調用它。 您應該在void EchoClient::printEcho() const方法中調用它。

問題出在我身上,我忘記了Qt的工作原理。 這里:

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

我在插槽末尾調用了messageLoop()。 哪個循環。 無限期 因此,控件永遠不會返回到Qt的EventLoop,並且無法處理新信號。 我可能以為任何新傳入的信號都會神奇地中斷已經在運行的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM