我对设计一个简单的系统感到困惑。
QLocalServer等待一个新的连接,并将信号连接到适当的时隙。
void CommandProcessor::onNewConnection()
{
QLocalSocket* pLocal = _server->nextPendingConnection();
connect(pLocal,SIGNAL(disconnected()),this,SLOT(onSocketDisconnected()));
connect(pLocal,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
connect(pLocal,SIGNAL(error(QLocalSocket::LocalSocketError)),this, SLOT(onSocketError(QLocalSocket::LocalSocketError)));
qDebug("Socket connected. addr=%p", pLocal);
}
The readyRead slot implementation is:
void CommandProcessor::onSocketReadyRead()
{
QLocalSocket* pLocalSocket = (QLocalSocket *) sender();
qDebug("SocketReadyRead. addr=%p", pLocalSocket);
QDataStream in(pLocalSocket);
in.setVersion(QDataStream::Qt_5_2);
pLocalSocket->readAll();
qDebug("%s pLocalSocket->bytesAvailable() = %d", Q_FUNC_INFO, pLocalSocket->bytesAvailable());
}这个readAll是有意进行的,目的是检查我如何按顺序获得两个readyRead信号(来自同一个时隙指针,我验证了这一点)。
客户端操作相当简单:
QByteArray data;
QDataStream out(&data, QIODevice::ReadWrite);
out.setVersion(QDataStream::Qt_5_2);
cmd.toDataStream(out);
// write blocksize at first field
out.device()->seek(0);
out << data.size() - sizeof(BLOCKSIZE_T);
qint64 bw = _socket->write(data);_套接字->写(数据)调用在服务器上触发重复的readyRead (即使服务器端已经用ReadAll调用读取了所有数据)。
我该去哪看看有什么指示吗?
发布于 2014-02-11 22:06:15
QIODevice的语义是这样的,以至于readyRead信号仅仅意味着可能有数据可供读取。这并不意味着一定有可用的数据,也不意味着保证一定数量的数据是可用的。当然,实现尽力避免虚假信号,但它们可以任意发布任意数量的“虚假”信号。这将是一个更糟糕的问题(事实上,是一个bug!)如果错过了readyRead信号。
当你收到信号时,你要做的就是读取任何可用的数据。就这样。绝对不能保证你会在任何特定的“分块”中得到数据。例如,如果连接的一端执行单个1 1kByte的写操作,则连接的另一端可能会得到任意数量的readyRead信号。
保证的是,如果只在收到readyRead信号时读取数据,就不会错过任何数据--因此,您不需要从任何地方读取数据,只需要连接到readyRead信号的插槽。
所以,你看到的一切都很好。当readyRead触发时,您需要处理任何可用的数据。包括零字节。
https://stackoverflow.com/questions/21713908
复制相似问题