Qt中TCP協(xié)議通信詳解
TCP協(xié)議是經(jīng)常使用的通信方式。在QT中做了非常友好的封裝,使用非常方便。
需要添加的模塊:network
Qt中的TCP類:QTcpSocket , QTcpServer
常用函數(shù)介紹
連接目標(biāo)地址和端口
virtual void QTcpSocket ::connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
- 發(fā)送數(shù)據(jù)
inline qint64 QTcpSocket ::write(const QByteArray &data)
- 監(jiān)聽(tīng)某個(gè)地址和端口號(hào)
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
- 有新的連接信號(hào)
void QTcpServer::newConnection();
- 是否有新的連接
virtual bool QTcpServer::hasPendingConnections() const;
- 獲取新的連接,必須處理完才能繼續(xù)接收到連接
virtual QTcpSocket *QTcpServer::nextPendingConnection();
- 收到新的數(shù)據(jù)信號(hào)
void QTcpSocket::readyRead();
- 讀取收到的數(shù)據(jù),必須讀取完才能繼續(xù)接收
QByteArray readAll();
使用案例(example)
客戶端
#include <QTcpSocket> #include <QWidget> #include <QLineEdit> class Client : public QWidget { ?? ?Q_OBJECT public: ?? ?Client(QWidget *parent); public slots: ?? ?void slotSendButtonClick(); private: ?? ?QTcpSocket *_socket; ?? ?QLineEdit *_lineEdit; ?? ?bool _isConnected; };
#include "client.h" #include <QPushButton> #include <QHBoxLayout> Client::Client(QWidget *parent) ?? ?: QWidget(parent) { ?? ?_socket = new QTcpSocket(this); ?? ?_lineEdit = new QLineEdit(this); ?? ?QPushButton *sendButton = new QPushButton("send"); ?? ?connect(sendButton, SIGNAL(clicked()), this, SLOT(slotSendButtonClick())); ?? ?connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotSendButtonClick())); ?? ? ?? ?QHBoxLayout *lay = new QHBoxLayout(this); ?? ?lay->addWidget(_lineEdit); ?? ?lay->addWidget(sendButton); ?? ?_isConnected = false; } void Client::slotSendButtonClick() { ?? ?if (!_isConnected) ?? ?{ ?? ??? ?_socket->connectToHost("127.0.0.1", 9988); ?? ??? ?_isConnected = true; ?? ?} ?? ?QString text = _lineEdit->text(); ?? ?if (!text.isEmpty()) ?? ?{ ?? ??? ?_socket->write(text.toUtf8());//發(fā)送數(shù)據(jù) ?? ??? ?_lineEdit->clear(); ?? ?} }
服務(wù)端
#include <QWidget> #include <QTcpServer> #include <QTcpSocket> class QTextBrowser; class Server :public QWidget { ?? ?Q_OBJECT public: ?? ?Server(QWidget *parent); public slots: ?? ?void slotCurrentIndexChanged(const QString&); ?? ?void slotNewConnection(); private: ?? ?QTcpServer *_server; ?? ?QTcpSocket *_socket; ?? ?QTextBrowser *_textBrowser; };
#include "server.h" #include <QHostAddress> #include <QTextBrowser> #include <QByteArray> #include <QGridLayout> #include <QNetworkInterface> #include <QComboBox> Server::Server(QWidget *parent) { ?? ?_server = new QTcpServer(this); ?? ?//_server->listen(QHostAddress::Any, 9988);//監(jiān)聽(tīng)跟本主機(jī)相連的所有網(wǎng)口 ?? ?connect(_server, SIGNAL(newConnection()),this, SLOT(slotNewConnection()) ); ?? ?QList<QHostAddress> addrList = QNetworkInterface::allAddresses(); ?? ?QComboBox *comboBox = new QComboBox; ?? ?for (const QHostAddress& addr : addrList) ?? ?{ ?? ??? ?quint32 ipAddr = addr.toIPv4Address(); ?? ??? ?if (ipAddr != 0) ?? ??? ?{ ?? ??? ??? ?comboBox->addItem(QHostAddress(ipAddr).toString()); ?? ??? ?} ?? ?} ?? ?connect(comboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotCurrentIndexChanged(const QString&))); ?? ?_textBrowser = new QTextBrowser(this); ?? ?QGridLayout *lay = new QGridLayout(this); ?? ?lay->addWidget(comboBox, 0, 0); ?? ?lay->addWidget(_textBrowser,1,0); } void Server::slotCurrentIndexChanged(const QString& item) { ?? ?if (!_server->isListening()) ?? ?{ ?? ??? ?_server->listen(QHostAddress(item), 9988); ?? ?} ?? ? ?? ?_textBrowser->append("listen..."); } void Server::slotNewConnection() { ?? ?_textBrowser->append("connecting..."); ?? ?while (_server->hasPendingConnections())//必須處理完所有的連接,否則有新連接時(shí)就不會(huì)在發(fā)信號(hào)過(guò)來(lái) ?? ?{ ?? ??? ?_socket = _server->nextPendingConnection(); ?? ??? ?connect(_socket, &QTcpSocket::readyRead, [&]() { ?? ??? ??? ?_textBrowser->append("receive message..."); ?? ??? ??? ?QByteArray newMessage = _socket->readAll(); ?? ??? ??? ?_textBrowser->append(QString(newMessage)); ?? ??? ?}); ?? ?} }
使用效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- QT實(shí)現(xiàn)簡(jiǎn)單TCP通信
- Qt實(shí)現(xiàn)簡(jiǎn)單的TCP通信
- QT編寫(xiě)tcp通信工具(Client篇)
- QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
- Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)
- Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
- 基于QT的TCP通信服務(wù)的實(shí)現(xiàn)
- QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例
- Qt TCP實(shí)現(xiàn)簡(jiǎn)單通信功能
相關(guān)文章
C語(yǔ)言中char*和char[]用法區(qū)別分析
這篇文章主要介紹了C語(yǔ)言中char*和char[]用法區(qū)別,包括使用過(guò)程中的誤區(qū)及注意點(diǎn)分析,需要的朋友可以參考下2014-09-09c++獲取進(jìn)程信息列表和進(jìn)程所調(diào)用的dll列表
這篇文章主要介紹了c++獲取進(jìn)程信息列表和進(jìn)程所調(diào)用的dll列表,大家參考使用吧2013-11-11C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之a(chǎn)++與++a
很多同學(xué)在學(xué)習(xí)c語(yǔ)言的時(shí)候是不是會(huì)碰到a++和++a都有甚么作用啊。今天我們就來(lái)探討下2017-10-10