这篇文章主要介绍了基于Qt的TCP怎么实现通信的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Qt的TCP怎么实现通信文章都会有所收获,下面我们一起来看看吧。
TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:
服务端:负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互;
客户端:负责每次连接的发起,建立连接后才可以进行通信;
服务器端
客户端
(1)服务器端设计
1、建立一个工程,工程名为tcpserver,类名为server。在.pro文件中加入如下代码并保存。
QT += network
2、进入server.h,添加类的前置声明
class QTcpServer; //QTcpServer类的前置声明 class QTcpSocket; //QTcpSocket类的前置声明
添加私有对象指针
QTcpServer *tcpServer; //添加QTcpServer私有对象指针 QTcpSocket *socket; //添加QTcpSocket私有对象指针
添加私有槽声明
void tcpServer_connect(); //连接函数 void read_data(); //读取从client发来的信息 void disconnected(); //断开连接 void on_sendButton_clicked(); //发送数据函数
3、转到server.cpp文件中
添加头文件#include,然后编写构造函数构造函数
Server::Server(QWidget *parent) : //构造函数 QDialog(parent), ui(new Ui::Server) { ui->setupUi(this); tcpServer = new QTcpServer(this); //创建对象 if(!tcpServer->listen(QHostAddress::LocalHost,6666)) //调用listen监听到来的连接,一旦有客户端连接到服务器,就发射newConnection信号 { qDebug()<<tcpServer->errorString(); close(); } ui->sendButton->setEnabled(false); // 设置按钮初始值值为false状态,即不可用 connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//将newConnection信号与槽函数连接起来 }
槽函数
//发送数据槽函数 void Server::on_sendButton_clicked() { socket->write(ui->sendText->toPlainText().toLocal8Bit()); //通过write函数发送数据 socket->flush(); ui->sendText->clear(); } //确认连接 void Server::tcpServer_connect() { socket=tcpServer->nextPendingConnection(); QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data); //当接收缓冲区有信号到来时,产生readyRead信号 QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//当接收到dinconnected信号时,执行disconnected函数 ui->sendButton->setEnabled(true); //按钮设置为有效 ui->label->setText(tr("连接成功!")); } //读取客户端发送的数据 void Server::read_data() { QByteArray buffer=socket->readAll(); //读取的数据放入QByteArray对象中 ui->recText->append(QString::fromLocal8Bit(buffer)); //将数据显示出来 } void Server::disconnected() { ui->sendButton->setEnabled(false); //断开连接后按钮值设置为无效 }
(2)客户端设计
1、建立一个工程,工程名为tcpclient,类名为client。在.pro文件中加入如下代码并保存。
QT += network
2、进入client.h,添加类的前置声明
class QTcpSocket; //QTcpSocket类的前置声明
定义一个套接字对象指针
QTcpSocket *tcpSocket; //定义一个套接字对象指针
添加私有槽函数声明
void readData(); //读取函数 void discon(); //断开连接 void on_connectButton_clicked(); //连接按钮槽函数 void on_sendButton_clicked(); //发送按钮槽函数
3、转到client.cpp,
添加头文件#include,并编写构造函数
Client::Client(QWidget *parent) : QDialog(parent), ui(new Ui::Client) { ui->setupUi(this); tcpSocket = new QTcpSocket(this); //定义套接字对象 //关联信号到自定义的槽上 QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData); //有接收数据时,执行读函数 QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon); ui->sendButton->setEnabled(false); }
槽函数
void Client::discon() { ui->sendButton->setEnabled(false); ui->connectButton->setText(tr("取消连接")); } //点击连接按钮,开始创建连接 void Client::on_connectButton_clicked() { if(ui->connectButton->text()==tr("连接")) { tcpSocket->abort(); tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//连接到指定主机的端口 if(!tcpSocket->waitForConnected(30000)) //超时连接失败 { qDebug()<<"Connection failed!"; return; } qDebug()<<"Connection successfully!"; ui->connectButton->setText("取消连接"); ui->sendButton->setEnabled(true); } else { tcpSocket->disconnectFromHost(); ui->connectButton->setText("连接"); ui->sendButton->setEnabled(false); } } //点击发送数据 void Client::on_sendButton_clicked() { QString sendData=ui->sendText->toPlainText(); //发送数据为文本框的的内容 tcpSocket->write(sendData.toLocal8Bit()); tcpSocket->flush(); ui->sendText->clear(); }
关于“基于Qt的TCP怎么实现通信”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“基于Qt的TCP怎么实现通信”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。