【发布时间】: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客户端它可以正常工作,所以这里肯定有问题。
标签: python c++ qt sockets network-programming