12 QT QTcpSocket

QTcpSocket

一、QT中的网络 network:

在这里插入图片描述

二、windows上的TCP编程模型和代码

在这里插入图片描述

三、QT上的TCP编程模型

服务器客户端
1.创建QTcpServer对象 相当于 windows的第1步1.创建QTcpSocket对象
2.监听 QTcpServer类的listen函数 相当于 windows的第2,3,4步2.连接服务器 QTcpSocket类的connectToHost函数,关联connected信号检查是否连接
3.等待客户端连接3.通信
3.1QTcpServer类的newConnection信号3.1 接收数据QTcpSocket 的 readyRead信号的槽使用QTcpSocket readAll()函数
3.2通过QTcpServer类的nextPendingConection函数来返回客户端的QTcpSocket类对象3.2 发送数据QTcpSocket 的 write 函数
4.通信4.断开连接
4.1 接收数据QTcpSocket 的 readyRead信号的槽使用QTcpSocket的 readAll函数获取内容
4.2 发送数据QTcpSocket 的 write 函数
5.断开QTcpSocket连接disconnectFromHost Close

示例:

在这里插入图片描述

第一步 加入network模式:

在这里插入图片描述

第二步 创建客户端和服务器:

1.添加服务器界面:
在这里插入图片描述将textEditRecv改为只读
在这里插入图片描述
2.添加客户端界面

创建客户端界面:
在这里插入图片描述在这里插入图片描述

设计客户端ui界面:

在这里插入图片描述

第三步连接:

服务器:
1.创建QTcpServer对象 相当于 windows的第1步
2.监听
    QTcpServer类的listen函数 相当于 windows的第2,3,4步
3.等待客户端连接
3.1QTcpServer类的Conection 信号
3.2通过QTcpServer类的nextPendingConection函数来返回客户端的QTcpSocket
(显示:
3.3获取客户端IP地址和端口号
3.4显示在某个地方 ui->textEditRevc()

widget.h
加入头文件:

#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>

创建对象:

QTcpServer *pTcpServer;
QTcpSocket *pTcpSocket;

widget.cpp

setWindowTitle("服务器");
//1.创建QTcpServer对象
pTcpServer =new QTcpServer(this);//指定父对象,让他可以自动回收内存
pTcpSocket =NULL;
//2.监听
 pTcpServer->listen(QHostAddress::Any,10086);

//3.等待客户端连接
//3.1关联信号与槽
connect(pTcpServer,&QTcpServer::newConnection,
        [=](){
          //3.2 获取客户端socket
          pTcpSocket= pTcpServer->nextPendingConnection();
          qDebug()<<"客户端连接服务器成功";
          //3.3获取客户端IP地址和端口号
          QString ipstr=pTcpSocket->peerAddress().toString();
          quint16 portUint= pTcpSocket->peerPort();

          QString buff=QString("客户端IP%1,客户端端口号%2").arg(ipstr).arg(portUint) ;

          //3.4显示在某个地方 ui->textEditRevc
          ui->textEditRecv->setText(buff);
        }

客户端:
1.创建QTcpSocket对象
2.连接服务器
    QTcpSocket类的connectToHost函数
    通过QTcpSocket类的connectToHost信号 知道 已经连接上服务器了
2.1获取用户输入的IP地址和端口号连接
2.2 连接服务器
2.3 关联信号与槽,检查是否连接上了服务器


clientwidget.h
头文件:

#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>

创建三个槽函数:

private slots:
    void on_BtnConent_clicked();
    void on_BtnSend_clicked();
    void on_BtnClose_clicked();

创建对象:

QTcpSocket* pTcpSocket;

clientwidget.cpp实现槽函数的连接:

void ClientWidget::on_BtnConent_clicked()
{
    //2.1获取用户输入的IP地址和端口号连接
    QString ipStr=ui->lineEditIP->text();
    quint16 portUint= ui->lineEditport->text().toUInt();

    //2.2 连接服务器
    pTcpSocket->connectToHost(ipStr,portUint);
}

关联信号与槽,检查是否连接上了服务器

在ClientWidget中写

//2.3 关联信号与槽,检查是否连接上了服务器
    connect(pTcpSocket,&QTcpSocket::connected,
            [=](){
        ui->textEditRecv->setText("连接服务器成功");
        });

四、通信:

服务器:
4.1 接收数据
    QTcpSocket 的 readyRead信号
    QTcpSocket的 readAll函数
4.2 发送数据
    QTcpSocket 的 write 函数

widget.cpp

接收(在等待客户端连接的槽函数中写):

 connect(pTcpSocket,&QTcpSocket::readyRead,
                 [=](){
                QByteArray data=pTcpSocket->readAll();
                ui->textEditRecv->append(data);
                 });

发送(在按钮的槽函数中写):

//4.2发送数据  服务器发送到客户端
void Widget::on_BtnSend_clicked()
{
    if(pTcpSocket)
    {
        QString str=ui->textEditSend->toPlainText();
         pTcpSocket->write(str.toUtf8().data());
    }
}

客户端
3.1 接收数据
    QTcpSocket 的 readyRead信号
    QTcpSocket的 readAll函数
3.2 发送数据
    QTcpSocket 的 write 函数
接收:
定义一个bool类型的变量:

 bool connected;

初始化为false;
连接成功后为true;

在服务器连接成功的客户端上抄:

connect(pTcpSocket,&QTcpSocket::readyRead,
                [=](){
                QByteArray data=pTcpSocket->readAll();
                ui->textEditRecv->append(data);
        });

发送(在按钮的槽函数中写):

void ClientWidget::on_BtnSend_clicked()
{
    if(connected)//判断是否连接
    {
        QString str=ui->textEditSend->toPlainText();
        pTcpSocket->write(str.toUtf8().data());
        qDebug()<<"发送成功";
    }
}

五、断开连接
客户端中写:

void Widget::on_BtnClose_clicked()
{
    if(pTcpSocket)
    {
        pTcpSocket->disconnectFromHost();
        pTcpSocket->close();
    }
}

服务器中同样:

void Widget::on_BtnClose_clicked()
{
    if(pTcpSocket)
    {
        pTcpSocket->disconnectFromHost();
        pTcpSocket->close();
    }
}

全部代码:

服务器widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>
#include<QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_BtnSend_clicked();
    void on_BtnClose_clicked();
private:
    Ui::Widget *ui;
    QTcpServer *pTcpServer;
    QTcpSocket *pTcpSocket;

};
#endif // WIDGET_H

服务器widget.cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("服务器");
    //1.创建QTcpServer对象
    pTcpServer =new QTcpServer(this);//指定父对象,让他可以自动回收内存
    pTcpSocket =NULL;
    //2.监听
    pTcpServer->listen(QHostAddress::Any,10086);

    //3.等待客户端连接
    //3.1关联信号与槽
    connect(pTcpServer,&QTcpServer::newConnection,
            [=](){
        //3.2 获取客户端socket
        pTcpSocket= pTcpServer->nextPendingConnection();
        qDebug()<<"客户端连接服务器成功";
        //3.3获取客户端IP地址和端口号
        QString ipstr=pTcpSocket->peerAddress().toString();
        quint16 portUint= pTcpSocket->peerPort();

        QString buff=QString("客户端IP%1,客户端端口号%2").arg(ipstr).arg(portUint) ;

        //3.4显示在某个地方 ui->textEditRevc
        ui->textEditRecv->setText(buff);
        //4. 通信
        //4.1 收   服务器接受客户端数据
            connect(pTcpSocket,&QTcpSocket::readyRead,
                 [=](){
                QByteArray data=pTcpSocket->readAll();
                ui->textEditRecv->append(data);
                 });
    });
}

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

//4.2发送数据  服务器发送到客户端
void Widget::on_BtnSend_clicked()
{
    if(pTcpSocket)
    {
        QString str=ui->textEditSend->toPlainText();
         pTcpSocket->write(str.toUtf8().data());
    }
}

void Widget::on_BtnClose_clicked()
{
    if(pTcpSocket)
    {
        pTcpSocket->disconnectFromHost();
        pTcpSocket->close();
    }

}

客户端clientwidget.h

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>


namespace Ui {
class ClientWidget;
}

class ClientWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ClientWidget(QWidget *parent = nullptr);
    ~ClientWidget();

private slots:
    void on_BtnConent_clicked();
    void on_BtnSend_clicked();
    void on_BtnClose_clicked();
private:
    Ui::ClientWidget *ui;
    //QTcpServer *pTcpserver;
    QTcpSocket* pTcpSocket;
    bool connected;

};

#endif // CLIENTWIDGET_H

客户端clientwidget.cpp

#include "clientwidget.h"
#include "ui_clientwidget.h"

ClientWidget::ClientWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientWidget)
{
    ui->setupUi(this);
    setWindowTitle("客户端");
    //1.创建QTcpSocket对象
    pTcpSocket =new QTcpSocket(this);
    connected=false;

    //2.3 关联信号与槽,检查是否连接上了服务器
    connect(pTcpSocket,&QTcpSocket::connected,
            [=](){
        ui->textEditRecv->setText("连接服务器成功");
        connected=true;
        //3.1 收   客户端接受服务器
        connect(pTcpSocket,&QTcpSocket::readyRead,
                [=](){
            QByteArray data=pTcpSocket->readAll();
                ui->textEditRecv->append(data);
        });

    });

}

ClientWidget::~ClientWidget()
{
    delete ui;
}
//2.连接服务器
void ClientWidget::on_BtnConent_clicked()
{
    //2.1获取用户输入的IP地址和端口号连接
    QString ipStr=ui->lineEditIP->text();
    quint16 portUint= ui->lineEditport->text().toUInt();

    //2.2 连接服务器
    pTcpSocket->connectToHost(ipStr,portUint);
}

//4发送数据  客户端  发送到  服务器
void ClientWidget::on_BtnSend_clicked()
{
    if(connected)
    {
        QString str=ui->textEditSend->toPlainText();
        pTcpSocket->write(str.toUtf8().data());
        qDebug()<<"发送成功";
    }
}

void ClientWidget::on_BtnClose_clicked()
{
    if(pTcpSocket)
    {
        pTcpSocket->disconnectFromHost();
        pTcpSocket->close();
    }
}

main.cpp

#include "widget.h"
#include"clientwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ClientWidget cw;
    Widget w;
    w.show();
    cw.show();
    return a.exec();
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值