[Qt] tcp通信服务器和客户端的搭建

一、服务器和客户端创建流程

        在pro文件中引入network

QT       += core gui network

        创建监听套接字对象和通信套接字对象

    QTcpServer *m_s;
    QTcpSocket *m_tcp;

        通过监听套接字对象的listen函数来监听

m_s->listen(QHostAddress::Any,port);

        通过信号与槽的机制建立连接并且生成通信套接字

 m_tcp = m_s->nextPendingConnection();

        通过通信套接字的readall函数来读取客户端发送的数据

QByteArray data =  m_tcp->readAll();

1、服务器头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
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_jianting_clicked();

    void on_fasong_clicked();

private:
    Ui::Widget *ui;
    QTcpServer *m_s;
    QTcpSocket *m_tcp;

};
#endif // WIDGET_H

2、服务器cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("服务器");

    m_s = new QTcpServer(this);

    //默认端口给到8000以上
    ui->port->setText("8000");

    //建立连接
    connect(m_s,&QTcpServer::newConnection,this,[=](){
        //连接成功后无法修改端口号
        ui->port->setDisabled(true);



        //创建套接字对象
        m_tcp = m_s->nextPendingConnection();
        ui->xianshi->append("有客户端连接");
        //是否可读
        connect(m_tcp,&QTcpSocket::readyRead,this,[=](){

            QByteArray data =  m_tcp->readAll();
            ui->xianshi->append("客户端:"+data);

        });

        //断开连接
        connect(m_tcp,&QTcpSocket::disconnected,this,[=](){

            m_tcp->close();

            //如果只想连接一次后就不能使用,手动释放掉m_tcp
            //m_tcp->deleteLater();

            ui->xianshi->append("断开连接");

        });

    });

}

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


void Widget::on_jianting_clicked()
{
    int port = ui->port->text().toUShort();
    //监听端口
    m_s->listen(QHostAddress::Any,port);


    ui->xianshi->append("开始监听");

}


void Widget::on_fasong_clicked()
{
    QByteArray data =  ui->shuru->toPlainText().toUtf8();
    //将输入框的内容传给套接字
    m_tcp->write(data);

    ui->xianshi->append("服务器:"+data);

}

3、服务器ui

二、 客户端创建流程

        在pro文件中引入network

QT       += core gui network

        和客户端不同,客户端只需要创建通信对象

QTcpSocket *m_tcp;

        通过connectToHost函数进行连接

m_tcp->connectToHost(QHostAddress(ip),port);

        断开时用close函数

m_tcp->close();

       

1、客户端头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>

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_lianjie_clicked();

    void on_duankai_clicked();

    void on_fasong_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *m_tcp;

};
#endif // WIDGET_H

2、客户端cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{


    ui->setupUi(this);
    this->setWindowTitle("客户端");
    //与客户端端口号保持一致
    ui->port->setText("8000");

    //ip地址如果是本地就用127.0.0.1,如果是异地就需要在cmd中输入 ipconfig查看ip
    ui->ip->setText("127.0.0.1");

    m_tcp = new QTcpSocket(this);

    connect(m_tcp,&QTcpSocket::readyRead,this,[=](){

        QByteArray data = m_tcp->readAll();

        ui->xianshi->append("服务器:"+data);


    });



}

Widget::~Widget()
{
    delete ui;


}


void Widget::on_lianjie_clicked()
{
    QString ip = ui->ip->text();
    int port = ui->port->text().toUShort();
    m_tcp->connectToHost(QHostAddress(ip),port);

    ui->xianshi->append("连接成功");

}


void Widget::on_duankai_clicked()
{
    m_tcp->close();
    ui->xianshi->append("断开连接");
    ui->lianjie->setDisabled(false);
}


void Widget::on_fasong_clicked()
{
    QByteArray data =  ui->shuru->toPlainText().toUtf8();

    m_tcp->write(data);

    ui->xianshi->append("客户端:"+data);
}

3、客户端ui

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值