为什么QTcpSocket不写?我需要刷新它,使它发送我的数据
我读的文档中发送一个包与QTcpSocket我可以只使用write
方法。 但是当我这样做时,我的服务器不会收到它。我需要拨打flush
或waitForByteWritten
发送。为什么QTcpSocket不写?我需要刷新它,使它发送我的数据
TCPClient::TCPClient(Client *babel , const std::string &hostname, unsigned short port, QObject *parent) : QObject(parent), client(babel), hostName(hostname), port(port), is_connected(false)
{
this->tcpSocket = new QTcpSocket(this);
connect(this->tcpSocket, SIGNAL(readyRead()),this, SLOT(readMessage()));
connect(this->tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
connect(this->tcpSocket, SIGNAL(connected()), this, SLOT(connectReady()));
connect(this->tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnectedReady()));
}
TCPClient::~TCPClient()
{
}
bool TCPClient::initiateService()
{
this->tcpSocket->connectToHost(this->hostName.c_str(), this->port);
this->tcpSocket->waitForConnected(5000);
}
void TCPClient::connectReady()
{
this->is_connected = true;
}
void TCPClient::disconnectedReady()
{
}
bool TCPClient::sendBabelPacket(Protocol::BabelPacket &packet)
{
if(this->tcpSocket->state() == QAbstractSocket::ConnectedState && is_connected)
{
std::cout << "writing ... size : " << sizeof(Protocol::BabelPacket) + packet.dataLength<<std::endl;
this->tcpSocket->write((const char *)&packet, sizeof(Protocol::BabelPacket) + packet.dataLength);
//this->tcpSocket->flush();
return true;
}
else
{
std::cout << "socket close" << std::endl;
return false;
}
}
void TCPClient::shutDown()
{
this->tcpSocket->abort();
}
void TCPClient::displayError(QAbstractSocket::SocketError socketError)
{
}
void TCPClient::readMessage()
{
char buffer[sizeof(Protocol::BabelPacket)];
this->tcpSocket->read(buffer, sizeof(Protocol::BabelPacket));
}
当我打电话write
,它返回的字节适量。
我在同一个线程的GUI上下文中使用这个类。
QTcpSocket
是一个缓冲设备,所以数据不是直接写入,而是写入内部缓冲区。 Documentation状态:
注:TCP套接字不能在QIODevice中::无缓冲模式中打开。
因此,您应该拨打flush
或waitForBytesWritten
以确保传送内容。
它们之间有区别。 flush
尽可能从内部写入缓冲区写入底层网络套接字而不会阻止。 waitForBytesWritten
块,直到至少一个字节被写入插座并发出bytesWritten()
信号。
好吧,我以为这是因为我的写作工作不正常,readyRead从未被删除,但似乎并非如此...有你是一个想法,为什么它永远不会发射? –
@DimitriDanilov'readyRead()'当新数据到达时发出,你确定你的服务器发送响应吗? – Nikita
是的,我肯定,readyRead()只有当我发送我的缓冲区与waitForBytesWritten()emmited,但它阻止...当我刷新数据到我的服务器,但我没有得到他的回应,因为readyRead( )未被触发。也许当我在GUI事件循环中时,它不能被触发? –
您能否提供指向您所指的文档的链接?你的总结听起来有几种不同的方式(例如,数据包是一个TCP实现的东西,与这个API无关),如果我能指出你正在查看的文档是什么,我认为我可以更好地澄清你的错误观念说。 (假设它是正确的,哪位....谁知道?) –