首页 Qt官方示例解析系列7:Fortune Server and Client
文章
取消

Qt官方示例解析系列7:Fortune Server and Client

这个示例与上一个类似,只是使用了QTcpServer和 QTcpSocket

服务端

elesos

用到了 QTcpServer

1
2
3
4
5
6
QTcpServer::newConnection信号收到后,就
tcpServer->nextPendingConnection();发送数据,最后disconnectFromHost();
其它:
Qt::TextBrowserInteraction 的作用是允许用户与文本标签进行交互,类似于文本浏览器(QTextBrowser)的交互行为。具体来说,它允许用户选择和复制文本内容,以及在文本中点击链接。
QGuiApplication::styleHints()->showIsFullScreen()  检查当前应用程序是否处于全屏
QNetworkInterface::allAddresses();用于获取当前系统上所有网络接口的 IP 地址。

Threaded Fortune Server解析

重新实现了QTcpServer,覆写了incomingConnection方法,在里面启动了一个线程。

使用qintptr保存socket描述符,通过setSocketDescriptor初始化

最后写数据:

1
2
3
tcpSocket.write(block);
tcpSocket.disconnectFromHost();
tcpSocket.waitForDisconnected(); //阻塞

客户端

elesos

1
2
3
4
5
6
QHostInfo::localHostName() 查本机机器名,
abortconnectToHost
有数据时QIODevice::readyRead()信号触发,读取数据,

因为数据不是一次性发完的,读数据前先QDataStream.startTransaction();开始一个事务。在调用该函数后,所有对 QDataStream 对象的数据操作都将被记录在事务中。
然后就可以读取数据,最后调用 commitTransaction() 函数来提交事务。

Blocking Fortune Client 解析

用到了QWaitCondition和QMutex(可能同时会读写线程的数据成员,所以这个线程一次只能处理一个请求)

调了线程的方法requestNewFortune,在里面再调用了start, 如果启动了,就wakeOne()。

使用了阻塞式api:waitForConnected和waitForReadyRead

处理完后,会cond.wait(&mutex);等待,让线程sleep

参考

https://doc.qt.io/qt-6/qtnetwork-fortuneserver-example.html

https://doc.qt.io/qt-6/qtnetwork-fortuneclient-example.html

https://doc.qt.io/qt-6/qtnetwork-threadedfortuneserver-example.html

https://doc.qt.io/qt-6/qtnetwork-blockingfortuneclient-example.html

本文由作者按照 CC BY 4.0 进行授权