[英]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.