这个示例与上一个类似,只是使用了QTcpServer和 QTcpSocket
服务端
用到了 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(); //阻塞
客户端
1
2
3
4
5
6
QHostInfo::localHostName() 查本机机器名,
先abort后connectToHost
有数据时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