我有一个显示表格、计算数据等的 QWidget TableView 类...
在它的构造函数中,我启动了该类的 FortuneServer 服务器:
FortuneServer::FortuneServer(QObject *parent)
: QTcpServer(parent)
{
...
此类在 FortuneServer::incomingConnection 上启动一个新线程,如下所示:
FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent)
: QThread(parent), socketDescriptor(socketDescriptor), text(fortune)
{
}
void FortuneThread::run()
{
QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
cout<<"socket error"<<endl;
return;
}
tcpSocket.waitForReadyRead(10000);
// this where sockets opens and waits for incoming data...
我需要执行以下操作:
这是如何正确完成的?
泰
最佳答案
从网络上的源读取字节时,您可以:
1-使用固定长度的二进制消息。所以你可以等待字节 block 被读取并做任何你需要做的事情。
2- 使用基于字符串的协议(protocol),该协议(protocol)使用分隔符来分隔消息。当看到分隔符时,您需要提取新的收入消息。
3- 使用 Content Length 之类的东西来了解有多少字节来了,你应该阅读。
在 Qt 中,您需要有一个 slot
在 调用类(class)。还有一个 signal
在 来电者类(class)。当一个新字符串到达时(使用任何方法),您只需发出信号,被调用的类就会得到通知。您必须使用 connect()
将插槽连接到信号的方法。我认为 QIODevice
它是 QTcpSocket
的父级有一个名为 readyRead() 的信号,当有新数据可用时,它会为您提供信号。
永远不要做可能在构造函数中抛出异常的操作。最好以不同的方法从构造函数中创建和启动服务器。
关于multithreading - 带有线程类的 Qt 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966061/