代码复现|QT快速入门 (课程来自B站)--其八

自己跟着老师的课程一步步跟着写下来的,有需要的可以自取,有用的话还希望点一个小小的赞同哦~

视频连接专栏的前几篇文章有,此处就不再冗余的放了(其实就是懒得粘贴链接了~~~)

八、多线程

客户端程序不变,服务器代码有改动

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
#include <QTcpSocket>
#include <QDebug>

class myThread : public QThread  //自己创建的线程类
{
    Q_OBJECT
public:
    explicit myThread(QTcpSocket *s);
    void run();  //重写虚函数,线程处理函数

signals:

public slots:
    void clientInfoSlot();

private:
    QTcpSocket *socket;
};

#endif // MYTHREAD_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <mythread.h>

#define PORT 8000  //定义宏,端口号

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 newClientHandler();
    void clientInfoSlot();  //客户端消息的槽函数

private:
    Ui::Widget *ui;
    QTcpServer *server;
};
#endif // WIDGET_H

mythread.cpp

#include "mythread.h"

myThread::myThread(QTcpSocket *s)
{
    socket = s;
}

void myThread::run()
{
    connect(socket,&QTcpSocket::readyRead,this,&myThread::clientInfoSlot);
}

//不能在其他类里面操作界面
void myThread::clientInfoSlot()
{
    qDebug() << socket->readAll();

}

widget.cpp

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

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

    server->listen(QHostAddress::AnyIPv4, PORT);  //两个参数,监听哪个网卡,监听的端口号

    //客户端发起连接,server发出信号
    connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);
}

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

void Widget::newClientHandler()
{
    // 建立TCP连接,返回QTcpSocket类型的地址,所以创建一个指针socket,IP地址和端口号都保存在socket里面
    QTcpSocket *socket = server->nextPendingConnection();
//    socket->peerAddress();  //获取客户端的地址
//    socket->peerPort();  // 获取端口号

    //打印客户端信息
    ui->ipLineEdit->setText(socket->peerAddress().toString());
    ui->portLineEdit->setText(QString::number(socket->peerPort()));

    //服务器收到客户端发送的信息,socket发出 readyread 信号
//    connect(socket,&QTcpSocket::readyRead,this,&Widget::clientInfoSlot);

    //启动线程
    myThread *t = new myThread(socket);  //创建线程对象,传递socket参数
    t->start();  //开始线程
}
/*
void Widget::clientInfoSlot()
{
    //在此函数中获取 newClientHandler 函数里面的局部变量 socket
    QTcpSocket *s = (QTcpSocket *)sender();  //槽函数中调用sender 可以获取信号的发出者。  强转一个新类型
    ui->mainLineEdit->setText(QString(s->readAll()));
//    mainLineEdit 类型在此路径文件中 D:\QT\Qtproject\QtOnline\build-TcpServer-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\ui_widget.h
}
*/

这个代码端可以运行,但不完善,后续代码会在听完课程后及时更新。

下一节课程题目:自定义信号 

还有三节课这个入门级课程就结束啦,加油!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值