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信号,关联槽函数读取数据

我们需要调用到的头文件有两个:

#include <QTcpServer>  
#include <QTcpSocket>

我们先要在工程文件中加入network

QT       += core gui network

本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT图像,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

下面我们来看看服务器程序步骤:

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 <QDebug>
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()<<msg;
}

void TcpServer::client_dis()
{
     QTcpSocket *obj = (QTcpSocket*)sender();//掉线对象
     qDebug()<<obj->peerAddress().toString();//打印出掉线对象的ip
}

说完服务器那我们继续来看看客户端是怎么实现的:

1、创建QTcpSocket对象

 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 <QDebug>
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()<<msg;
}

void TcpClient::on_btn_connectServer_clicked()
{
    //检测链接成功信号关联槽函数
    connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc()));
    //检测掉线信号
    connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));
    //连接服务器,设置ip和端口号
    mSocket->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<QTcpSocket*> clients; //存储所有在线客户端(容器)
  解释:QTcpSocke*  容器的类型
       clients  容器名

2、往容器中添加成员

//上线用户添加到客户列表容器
 clients.append(mSocket); 

3、寻找某个成员在容器中位置

 int row = clients.indexOf(obj);//找到掉线对象的内容所在的行

4、从容器中删除成员

  clients.remove(row);//从容器中删除成员

 如果你对QT开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT图像,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值