QT的TCP通信

QT的TCP通信

今天简单学习了一下Qt中的TCP通信,实现了一个简单的对话框。
首先贴一下TCP的概念

TCP是一种面向连接的传输层控制协议,可靠的,基于字节流的传输协议,由IETF的RFC 793定义。和UDP最大的区别是需要连接的,三次握手四次挥手,校验机制保证了数据传输的稳定性和可靠性,在接收过程中定期的回送他自己的一个状态给客户端,客户端也会根据这样的状态进行这样的速度调整,以便自己客户端的速度适应服务端的额速度。

接下来是编程部分
QT提供了QTcpSocket类,我们基于它来实现程序。在QT中进行网络编程,首先要在.pro文件里添加network。也就是

QT += network

客户端部分

1、我们在ClientWidget类里定义一个私有成员

QTcpSocket* tcpsocket = nullptr;

2、接着在构造函数里实例化

tcpsocket = new QTcpSocket(this);

3、请求连接与断开连接

	//请求连接
    connect(ui -> ButtonConnect,&QPushButton::clicked,[=]()
    {
        tcpsocket -> connectToHost(ui->lineEditIP->text(),ui->lineEditPort->text().toInt());
    });

    //关注是否连上了服务器
    connect(tcpsocket,&QTcpSocket::connected,[=]()
    {
        ui->textEditRead->append("成功连上了服务器!");
    });

4、发送数据、接收数据

    //发送数据
    connect(ui->ButtonSend,&QPushButton::clicked,[=]()
    {
        //首先获取文本框的数据
        QString data = ui->textEditWrite->toPlainText();
        tcpsocket->write(data.toStdString().data());

        ui->textEditWrite->clear();
    });

    //接收数据
    connect(tcpsocket,&QTcpSocket::readyRead,[=]()
    {
        QByteArray data = tcpsocket->readAll();
        ui->textEditRead->append(data.toStdString().data());
    });

服务端部分
1、我们首先在ServerWidget类里定义两个私有成员

    QTcpServer* tcpserver = nullptr;
    QTcpSocket* tcpsocket = nullptr;

2、监听

    //构造监听套接字
    tcpserver = new QTcpServer(this);
    //监听
    tcpserver -> listen(QHostAddress::Any,8888);

3、关注有无新信号
建立连接后在槽函数内处理接收到的数据

    //关注有无新连接的信号
    connect(tcpserver,&QTcpServer::newConnection,[=]()
    {
        //取出建立好连接的套接字
        tcpsocket = tcpserver -> nextPendingConnection();

        //获取客户端的信息,ip,port
        QString ip = tcpsocket -> peerAddress().toString();
        qint64 port = tcpsocket -> peerPort();
        QString temp = QString("客户端成功连接到服务端 ip:%1,port,%2").arg(ip).arg(port);

        //连接成功后显示成功信息
        ui -> textEditRead -> append(temp);

        //处理接收的数据
        connect(tcpsocket,&QTcpSocket::readyRead,[=]()
        {
            //处理数据
            if(tcpsocket != nullptr)
            {
                QByteArray data = tcpsocket ->readAll();
                ui -> textEditRead -> append(data);
            }
        });

    });

4、向客户端发送数据

    connect(ui->ButtonSend,&QPushButton::clicked,[=]()
    {
        //发送数据给客户端
        QString data = ui ->textEditWrite->toPlainText();
        if(tcpsocket != nullptr)
        {
            tcpsocket->write(data.toStdString().data());
            //data.toStdString().data() data从qstring转到了char*
        }

        ui->textEditWrite->clear();
    });
实现的效果如下图

client端

server端

程序主体到这里就结束了,大家有什么问题以及宝贵建议可以在评论区提出。
希望与大家共同学习成长!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值