Qt学习(五):TCP通信

12 篇文章 2 订阅

知识点

https://github.com/taw19960426/Qt_study/tree/main/QTcpTest

结果演示

在这里插入图片描述

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //为了防止段错误
    tcpServer = NULL;
    tcpSocket = NULL;

    setWindowTitle("服务端(端口:8888)");

    //监听套接字,指定父对象,让其自动回收空间
    tcpServer = new QTcpServer(this);

    tcpServer->listen(QHostAddress::Any,8888);

    connect(tcpServer,&QTcpServer::newConnection,
            [=](){
        //取出建立好连接的套接字
        tcpSocket=tcpServer->nextPendingConnection();

        //获取对方的IP和端口
        QString ip=tcpSocket->peerAddress().toString();
        qint16 port =tcpSocket->peerPort();
        QString ipDate=QString("ip=%1 port=%2").arg(ip).arg(port);

        ui->showEdit->setText(ipDate);

        //从通信套接字中取出内容
        connect(tcpSocket,&QTcpSocket::readyRead,
                [=](){
                        QByteArray array=tcpSocket->readAll();
                        ui->showEdit->append(array);
                    }

                );
    }

    );
}

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

void Widget::on_buttonSend_clicked()
{
    if(NULL == tcpSocket)
    {
        return;
    }

    //获取编辑区内容
    QString str=ui->sendEdit->toPlainText();
    //给对方发送数据, 使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

void Widget::on_buttonClose_clicked()
{
    if(NULL == tcpSocket)
    {
        return;
    }

        //主动和客户端端口连接
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
        tcpSocket = NULL;
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_buttonSend_clicked();

    void on_buttonClose_clicked();

private:
    Ui::Widget *ui;
    QTcpServer *tcpServer; //监听套接字
    QTcpSocket *tcpSocket; //通信套接字
};

#endif // WIDGET_H

clienttcp.cpp

#include "clienttcp.h"
#include "ui_clienttcp.h"
#include <QHostAddress>

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

    tcpSocket=new QTcpSocket(this);

    connect(tcpSocket,&QTcpSocket::connected,
            [=](){
                    ui->textEditRead->setText("与服务端已经成功连接!");
                 }

            );

    //从通信套接字里面取内容
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=](){
                    //获取对方发送的内容
                    QByteArray array = tcpSocket->readAll();
                    //追加到编辑区中
                    ui->textEditRead->append(array);
                 }

            );

}

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

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

    //主动和服务器建立连接
    tcpSocket->connectToHost(QHostAddress(ip),port);
}

void ClientTCP::on_buttonWrite_clicked()
{
    //获取编辑器内容,发送到套接字
    //获取编辑区内容
    QString str=ui->textEditWrite->toPlainText();
    //给对方发送数据, 使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

void ClientTCP::on_buttonClose_clicked()
{
    //主动和客户端端口连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();

}

clienttcp.h

#ifndef CLIENTTCP_H
#define CLIENTTCP_H

#include <QWidget>
#include <QTcpSocket>

namespace Ui {
class ClientTCP;
}

class ClientTCP : public QWidget
{
    Q_OBJECT

public:
    explicit ClientTCP(QWidget *parent = 0);
    ~ClientTCP();

private slots:
    void on_buttonConnect_clicked();

    void on_buttonWrite_clicked();

    void on_buttonClose_clicked();

private:
    Ui::ClientTCP *ui;
    QTcpSocket *tcpSocket; //通信套接字

};

#endif // CLIENTTCP_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐维康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值