QT之TCP通信
QT之TCP通信
QT中可以通过TCP协议让服务器和客户端之间行通信。所以下面我就围绕服务器和客户端来写。
这是我们写服务器和客户端的具体流程:
A、服务器:
1.创建QTcpServer对象
2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
3.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
4.QTcpsocket发送数据用成员方法write,
5.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据
B、客户端 :
1.创建QTcpSocket对象
2.链接服务器connectToHost(QHostAddress("ip"),端口号)
3.QTcpsocket发送数据用成员方法write,
4.读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据 【相关文章推荐】
点击领取→Qt开发进阶技术栈学习路线+资料
我们需要调用到的头文件有两个: #include #include
我们先要在工程文件中加入network QT += core gui network
下面我们来看看服务器程序步骤:
1、初始化服务器server对象 mServer = new QTcpServer();
2、启动监听服务器 mServer->listen(QHostAddress::Any,9988);//9988为端口号
3、当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket) connect(mServer,SIGNAL(newConnection()),this,SLOT(new_client())); mSocket = mServer->nextPendingConnection();//与客户端通信的套接字
4、发送数据 mSocket->write(msg.toUtf8());
5、读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据 connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_client_data()));
6、连接多个客户端 //可以实现同时读取多个客户端发送过来的消息 QTcpSocket *obj = (QTcpSocket*)sender();
7、检测掉线 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis())); //检测掉线信号
下面是服务器的实现的具体代码: #include "tcpserver.h" #include "ui_tcpserver.h" #include TcpServer::TcpServer(QWidget *parent) : QMainWindow(parent), ui(new Ui::TcpServer) { ui->setupUi(this); //初始化服务器server对象 mServer = new QTcpServer(); //关联客户端连接信号newConnection connect(mServer,SIGNAL(newConnection()),this,SLOT(new_client())); //连接客户端 //启动服务器监听 mServer->listen(QHostAddress::Any,9988); } TcpServer::~TcpServer() { delete ui; } void TcpServer::new_client() { qDebug()<<"新客户段连接"; mSocket = mServer->nextPendingConnection();//与客户端通信的套接字 //关联接收客户端数据信号readyRead信号(客户端有数据就会发readyRead信号) connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_client_data())); //检测掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis())); } void TcpServer::read_client_data() { //可以实现同时读取多个客户端发送过来的消息 QTcpSocket *obj = (QTcpSocket*)sender(); QString msg = obj->readAll(); qDebug()<peerAddress().toString();//打印出掉线对象的ip }
说完服务器那我们继续来看看客户端是怎么实现的:
1、创建QTcpSocket对象 【相关文章推荐】
点击领取→Qt开发进阶技术栈学习路线+资料 mSocket = new QTcpSocket();
2、链接服务器connectToHost(QHostAddress("ip"),端口号),连接服务器ip和端口号 mSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toInt()); //ui->ipEdit->text():ip,ui->portEdit->text().toInt():端口号
3、发送数据 //取发送信息编辑框内容 QString msg = ui->sendEdit->toPlainText(); mSocket->write(msg.toUtf8());//转编码
4、检测链接成功信号关联槽函数 connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc()));
5、检测掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));
6、服务器和客户端关闭都可以使用close mSocket->close();
这是客户端实现的具体代码 #include "tcpclient.h" #include "ui_tcpclient.h" #include TcpClient::TcpClient(QWidget *parent) : QMainWindow(parent), ui(new Ui::TcpClient) { ui->setupUi(this); //初始化套接字对象 mSocket = new QTcpSocket(); //关联数据信号 connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_data())); } TcpClient::~TcpClient() { delete ui; } void TcpClient::read_data() { QString msg = mSocket->readAll(); qDebug()<connectToHost(ui->ipEdit->text(),ui->portEdit->text().toInt()); } void TcpClient::on_btn_send_clicked() { //取发送信息编辑框内容 QString msg = ui->sendEdit->toPlainText(); mSocket->write(msg.toUtf8());//转编码 } void TcpClient::connect_suc() { ui->btn_connectServer->setEnabled(false);//如果连接成功则连接按钮不能按下 } void TcpClient::client_dis() { ui->btn_connectServer->setEnabled(true);//如果连接没有成功则连接按钮还可以按下 }
这是服务器和客户端分开两个文件夹写的程序,在这里我也实现了服务器和客户端写在同一个文件中
具体代码如下:
头文件:tcpapp.h
View Code
源文件:tcpapp.cpp
View Code
界面文件tcpapp.ui如下图
此外这里还使用到了容器,在这里讲讲容器的使用
1、定义容器对象 QVector clients; //存储所有在线客户端(容器) 解释:QTcpSocke* 容器的类型 clients 容器名
2、往容器中添加成员 //上线用户添加到客户列表容器 clients.append(mSocket);
3、寻找某个成员在容器中位置 int row = clients.indexOf(obj);//找到掉线对象的内容所在的行
4、从容器中删除成员 clients.remove(row);//从容器中删除成员
如果你对QT开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!