在QT里使用TCP进行网络通信

在Qt中使用TCP进行通信主要涉及以下几个步骤:

1. **创建QTcpServer对象**:这个对象用于监听来自客户端的连接请求。
2. **创建QTcpSocket对象**:这个对象用于与客户端进行通信。当客户端连接到服务器时,QTcpServer会发出一个新的QTcpSocket对象。
3. **连接信号和槽**:你需要连接QTcpSocket的信号(如`readyRead()`)到你的槽函数,以便在数据可读时进行处理。
4. **读写数据**:使用QTcpSocket的`write()`和`readAll()`或`read()`方法发送和接收数据。

 

一.创建TCP客户端

1)添加配置

在.pro文件里添加网络模块,添加之后保存文件
QT += network
 

2)创建QTcpSocket

 
 

QTcpSocket* socket = new QTcpSocket(this);//创建socket对象

socket->connectToHost(QHostAddress("192.168.31.196"), 55555);   //连接服务器

 
connect(socket, SIGNAL(connected()), this, SLOT(socket_connect()));
//当连接成功之后socket对象会发出一个connected()信号通知我们,然后执行槽函数。
 
 
connect(socket, SIGNAL(readyRead()), this, SLOT(socket_read()));
//socket收到数据时发出readyRead()信号
 
 
connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnect()));
//断开连接之后,socket发送disconnected()信号
 
 
qint64 write(const QByteArray &data);
 //发送数据到连接的套接字。返回实际写入的字节数。
 
 
qint64 readAll(const QByteArray &data); 
//接收数据
 
示例:
#include <QTcpSocket>
#include <QHostAddress>
QTcpSocket* socket = new QTcpSocket(this);//创建socket对象

socket->connectToHost(QHostAddress("192.168.31.196"), 55555);

connect(socket, SIGNAL(connected()), this, SLOT(socket_connect()));

//连接成功后,断开连接发送disconnected()
connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnect()));

//socket收到数据时发出readyRead()
connect(socket, SIGNAL(readyRead()), this, SLOT(socket_read()));

void MainWindow::socket_read()
{
    //socket->readAll();读取收到的所有数据,返回值是一个字节数组对象,字节数组是以字节为单位
    //的数组,注意字节数组不是字符串。byte就是一个字节的整数
    QByteArray data = socket->readAll();
    //QString::fromLocal8Bit(data)将字节数组转换成QString对象,前提是收到的数据一定是一个
    字符串。
    ui->textBrowser->append(QString::fromLocal8Bit(data));
}
void MainWindow::on_pushButton_send_clicked()
{
    QString data = ui->lineEdit_msg->text();
    QByteArray bdata = data.toLocal8Bit();//将字符串转换成字节数组,socket的数据收发都
    //是字节数组
    //bdata.data()返回指向字节数组中数据的指针
    //bdata.size()返回字节数组的长度 size length count一般都是用来表示长度的单词
    //socket->write(bdata.data(), bdata.size());
    socket->write(bdata);
}

 

二.创建服务器

1)获得本机ip

//QHostInfo主机信息类
QString localHostName = QHostInfo::localHostName();//获得主机名称
QHostInfo info = QHostInfo::fromName(localHostName);//根据主机名称获得主机信息
QList<QHostAddress> list = info.addresses();//获得主机地址,因为一台计算机大概率不止一个
ip
Qstring ip;
for(int i = 0;i < list.size();i++)
{
    //list[i]获得地址数组中的i元素,QHostAddress对象
    //protocol获得地址的协议类型,==QAbstractSocket::IPv4Protocol比较地址是否是ipv4的地
    //址
    if(list[i].protocol()==QAbstractSocket::IPv4Protocol)
    {
        //字符串拼接
        ip+="*";
        ip+=list[i].toString();
    }
}
ui->lable_ip->setText(ip); //显示在lable上

2QTcpServer

QTcpServer类用于监听客户端的连接,每当有一个客户端连接到服务端,都会生成一个新的

QTcpSocket对象与客户端通信。

QTcpServer* server; //创建对象,实参是内存管理的父节点
QTcpSocket* socket; //创建客户端套接字(临时的,后期会改成多线程并发服务器)
server = new QTcpServer(this);
//监听主机的ip地址和端口号,QHostAddress::Any表示监听主机的所有ip
server->listen(QHostAddress::Any, 55555);
//当有新的客户端连接时,server对象会发出newConnection信号
connect(server, SIGNAL(newConnection()), this, SLOT(newConnect()));
void MainWindow::newConnect()
{
    qDebug()<<”客户端连接我了”;
    socket = server->nextPendingConnection();//获得与客户端通信的QTcpSocket对象
    //连接socket的信号与槽
    connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnect()));
    connect(socket, SIGNAL(readyRead()), this, SLOT(socket_read()));
}

之后服务器就能和客户端通信了。

 

最后的最后,非常感谢大家观看,希望大家点点赞,点点关注,谢谢!

 

相关推荐

  1. QT使用TCP进行网络通信

    2024-04-10 05:58:07       30 阅读
  2. QT网络通信-TCP、UDP通信

    2024-04-10 05:58:07       50 阅读
  3. QT TCP通信介绍

    2024-04-10 05:58:07       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 05:58:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 05:58:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 05:58:07       87 阅读
  4. Python语言-面向对象

    2024-04-10 05:58:07       96 阅读

热门阅读

  1. Android 14 vold 分析(1)启动

    2024-04-10 05:58:07       25 阅读
  2. Android 14 vold 分析(2)VolumeManager 和 NetlinkManger

    2024-04-10 05:58:07       27 阅读
  3. MyBatis事务管理

    2024-04-10 05:58:07       32 阅读
  4. 手写一个民用Tomcat (03)

    2024-04-10 05:58:07       31 阅读
  5. Android 14 vold 分析(3)vold和mount service通信

    2024-04-10 05:58:07       29 阅读
  6. 小程序中展示富文本 图片不适配?视频不显示?

    2024-04-10 05:58:07       44 阅读
  7. CentOS 7关机与重启命令详解

    2024-04-10 05:58:07       46 阅读