QT中的TCP/IP通信

在Qt中实现TCP/IP
  服务器端通信流程:
    1:创建套接字
    2:将套接字设置为监听模式
    3:等待并接受客户端请求
    可以通过QTcpServer提供的void newConnection()信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingConnection函数获取到客户端的Socket信息(返回值为QTcpSocket*类型指针),通过此套接字与客户端之间进行通信。
    4:接收或者向客户端发送数据
    5:接收数据:使用read()或者readAll()函数
    6:发送数据:使用write()函数
  客户端通信流程:
    1:创建套接字
    2:连接服务器
    可以使用QTcpSocket类的connectToHost()函数来连接服务器。
    3:向服务器发送或者接受数据

在这里插入图片描述
下面例子为简单的TCP/IP通信的实现:
服务器代码cpp:

#include "severwidget.h"
#include "ui_severwidget.h"

SeverWidget::SeverWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SeverWidget)
{
    ui->setupUi(this);
    this->setWindowTitle("服务器:端口8888");
    tcpsocket = NULL;
    tcpserver = NULL;

    /*服务器流程*/
    //监听套接字

    tcpserver = new QTcpServer(this);   //内存回收机制,在执行析构函数时自动释放内存
    //监听(blind + listen) 第一个参数代表当前网卡所有的端口
    tcpserver->listen(QHostAddress::Any,8888); //参数端口号只要跟客户端 一致即可


    //连接成功会触发new connect信号
    connect(tcpserver,&QTcpServer::newConnection,[=](){
        //取出建立好连接的套接字
        tcpsocket = tcpserver->nextPendingConnection();

        //获取对方的ip和端口
        QString ip   = tcpsocket->peerAddress().toString();  //ip
        qint16  port = tcpsocket->peerPort();    //port
        QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
        //将temp数据显示在窗口上
        ui->textEditRead->setText(temp);

        //服务器接收数据,当服务器接收到数据时,会触发一个readready的信号
         connect(tcpsocket,&QTcpSocket::readyRead,[=](){
             //从通信套接字中取出内容
             QByteArray array= tcpsocket->readAll();
             ui->textEditRead->append(array); //append 追加
         });

    });



}

SeverWidget::~SeverWidget()
{
    delete ui;
}

void SeverWidget::on_btn_Send_clicked()
{
    if(NULL == tcpsocket)
    {
        return;
    }
   //获取编辑区的内容
    QString str = ui->textEditWrite->toPlainText();

    //给对方发送套接字socket
    tcpsocket->write(str.toUtf8().data());

}

void SeverWidget::on_btn_Close_clicked()
{
   if(NULL == tcpsocket)
    {
        return;
    }
   //主动和客户端断开连接
   tcpsocket->disconnectFromHost();
   tcpsocket->close();
   tcpsocket =NULL;

}

客户端cpp代码:

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include <QHostAddress>


ClientWidget::ClientWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientWidget)
{
    ui->setupUi(this);
    this->setWindowTitle("客户端");

    Tcpsocket = NULL;
    Tcpsocket = new QTcpSocket(this);

    /*监听connect信号,当与服务器连接成功时,显示连接成功在窗口上*/
    connect(Tcpsocket,&QTcpSocket::connected,[=](){

          ui->textEditRead->append("成功和服务器连接");

     });

    /*监听数据接收信号,当服务器发数据过来时,会触发一个readyread的信号,我们监听这个信号*/
    connect(Tcpsocket,&QTcpSocket::readyRead,[=](){
        //将接收到的数据显示在窗口上
        QByteArray array = Tcpsocket->readAll();
        ui->textEditRead->append(array);  //追加  不要用settext,会覆盖原来的数据
    });

}

ClientWidget::~ClientWidget()
{
    delete ui;
}

void ClientWidget::on_btn_connect_clicked()
{
    //获取服务器ip和端口
    QString ip = ui->lineEditIP->text();
    qint16 port = ui->lineEditPort->text().toInt();

    //主动和服务器连接
    Tcpsocket->connectToHost(QHostAddress(ip),port);

}

void ClientWidget::on_btn_send_clicked()
{
    //获取编辑框里的内容
    QString str = ui->textEditWrite->toPlainText();
    //将获取到的数据发送给服务器
    Tcpsocket->write(str.toUtf8().data());

}

void ClientWidget::on_pushButton_3_clicked()
{
   //主动断开连接,
    Tcpsocket->disconnectFromHost();
    Tcpsocket->close();
    ui->textEditRead->append("断开连接");

}

最终运行结果:
在这里插入图片描述
本例子可实现tcp服务器和tcp客户端双向通信。

本例子的源码下载地址:源码下载地址https://download.csdn.net/download/weixin_38931060/12683129

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: QT是一个流行的跨平台开发框架,支持多种Web、移动和桌面应用程序的编写。TCP/IP是因特网通信协议的核心,提供了基于网络的协议和服务,同时TCP/IP也是数据通信的基础协议。 由于QT框架非常强大,其提供了许多可扩展的模块和库,包括QtNetwork模块,该模块可用于构建可靠和高效的网络应用程序,并且包括一些TCP/IP打包和解包工具。这些工具可以帮助开发者更轻松地构建面向网络的应用程序,并且提供高效的数据包处理和传输机制。 在QT网络模块,最常用的TCP/IP打包工具是QDataStream类。 这个类提供了一组方法,可以将Qt数据类型和基本数据类型打包成TCP/IP数据包形式。同时还提供了解开TCP/IP数据包的接口。使用QDataStream可以让开发者轻松实现TCP/IP协议的打包和解包功能,同时还可以用它来进行错误检测和恢复数据完整性。 总之,QT提供了强大的网络模块,可以帮助开发者构建高效和稳定的网络应用程序。在这个模块TCP/IP打包工具是一个重要的组件,它帮助开发者更轻松地实现对TCP/IP协议的支持和应用。 ### 回答2: Qt是一个跨平台的应用程序开发框架,可以用于开发各种类型的应用程序。其Qt提供了丰富的网络编程类库,支持使用TCP/IP协议进行网络通信。在TCP/IP通信过程,需要将数据打包成包的形式进行传输,这就需要使用Qt提供的打包工具。 Qt提供了一个名为QDataStream的类,它可以将数据从内存读取并写入到TCP/IP报文,也可以将数据从TCP/IP报文反序列化到内存。QDataStream支持各种数据类型,包括整数、浮点数、字符串等。此外,QDataStream还支持自定义数据类型的序列化和反序列化,可以轻松地将自定义的对象写入到TCP/IP报文。 使用Qt进行TCP/IP通信时,可以将需要发送的数据转换成字节数组并发送。这种方式简单易用,但数据量较大时可能会有一定的性能影响。因此,在Qt也提供了高级的打包工具,如QIODevice。QIODevice是一个抽象类,提供了对各种I/O设备的统一操作接口,例如文件、串口等。借助QIODevice,可以将TCP/IP报文直接写入网络套接字,实现高效的数据传输。 总之,Qt提供了丰富的网络编程类库和打包工具,可以轻松地实现TCP/IP通信和数据传输。用户可以根据自己的需求选择适合的工具方便地进行开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值