IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接) -> 正文阅读

[网络协议]Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接)

一、服务器

1.1 ui设计

1.1.1 图像展示

在这里插入图片描述

1.1.2 类名定义

在这里插入图片描述

1.2 代码展示

1.2.1 mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

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

//继承QThread这个类,
class Mythread : public QThread
{
    Q_OBJECT
public:
    explicit Mythread(QTcpSocket *s);
    //线程函数(虚函数)
    void run();

signals:
    void SendToWidget(QByteArray ba);

public slots:
    void ClientinfoSlots();
    void ThreadSlots(QByteArray ba);
private:
    QTcpSocket *sock;
};

#endif // MYTHREAD_H

1.2.2 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
#include "mythread.h"
#define PORT 8000

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void NewClientHandeler();
    void ClientInfiSlots();
    void ThreadSlots(QByteArray ba);

private:
    Ui::Widget *ui;
    QTcpServer *Tcpserver;
    QTcpSocket *socket;
};

#endif // WIDGET_H

1.2.3 mian.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

1.2.4 mythread.cpp

#include "mythread.h"

Mythread::Mythread(QTcpSocket *s)
{
    sock = s;
}

void Mythread::run()
{
    connect(sock,&QTcpSocket::readyRead,this,&Mythread::ClientinfoSlots);
}

void Mythread::ClientinfoSlots()
{
    QByteArray ba = sock->readAll();
    emit SendToWidget(ba);
}

1.2.5 widget.cpp

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    Tcpserver = new QTcpServer;
    socket = new QTcpSocket;
    //监听任何IPv4地址,PORT是写死8000的
    Tcpserver->listen(QHostAddress::AnyIPv4,PORT);
    //客户端发起连接,server会发出信号
    connect(Tcpserver,&QTcpServer::newConnection,this,&Widget::NewClientHandeler);
}

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

void Widget::NewClientHandeler()
{
    //建立tcp连接
    socket = Tcpserver->nextPendingConnection();//socket就包含了这个客户端的所有消息
    socket->peerPort(); //对端(客户端)的端口
    socket->peerAddress(); //对端(客户端)的ip地址
    //进行显示
    ui->IplineEdit->setText(socket->peerAddress().toString());
    ui->PortlineEdit->setText(QString::number(socket->peerPort()));
    //判断是发信息的,不是发起连接的,之后进行槽函数处理
    //connect(socket,&QTcpSocket::readyRead,this,&Widget::ClientInfiSlots);
    //创建新线程(new 一个对象)
    Mythread *t = new Mythread(socket);
    t->start();
    connect(t,&Mythread::SendToWidget,this,&Widget::ThreadSlots);
}

void Widget::ClientInfiSlots()
{
    ui->MesglineEdit->setText(QString(socket->readAll()));
}

void Widget::ThreadSlots(QByteArray ba)
{
    ui->MesglineEdit->setText(QString(ba));
}

二、客户端

2.1 ui设计

2.1.1 图像展示

在这里插入图片描述
在这里插入图片描述

2.1.2 类名定义

在这里插入图片描述
在这里插入图片描述

2.2 代码展示

2.2.1 chat.h

#ifndef CHAT_H
#define CHAT_H

#include <QWidget>
#include <QTcpSocket>

namespace Ui {
class chat;
}

class chat : public QWidget
{
    Q_OBJECT

public:
    explicit chat(QTcpSocket *s,QWidget *parent = 0);
    ~chat();

private slots:
    void on_SendButton_clicked();

    void on_ClearButton_clicked();

    void on_CloseButton_clicked();

private:
    Ui::chat *ui;
    QTcpSocket *sock;
};

#endif // CHAT_H

2.2.2 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QHostAddress>
#include "chat.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_ConnectButton_clicked();

    void on_CloseButton_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *sock;
};

#endif // WIDGET_H

2.2.3 chat.cpp

#include "chat.h"
#include "ui_chat.h"

chat::chat(QTcpSocket *s,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::chat)
{
    ui->setupUi(this);
    sock = s;
}

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

void chat::on_SendButton_clicked()
{
    QByteArray ba;
    //将文本框内的内容转到二进制数组里面
    ba.append(ui->MesglineEdit->text());
    //写的是二进制
    sock->write(ba);
}

void chat::on_ClearButton_clicked()
{
    ui->MesglineEdit->clear();
}

void chat::on_CloseButton_clicked()
{
    this->close();
}

2.2.4 main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

2.2.5 widget.cpp

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    sock = new QTcpSocket; //创建套接字对象
    //连接成功
    connect(sock,&QTcpSocket::connected,[this](){
        QMessageBox::information(this,"连接提示","连接成功");
        //连接成功将隐藏当前窗口,进入chat页面
        this->hide();
        chat *c = new chat(sock);
        c->show();
    });
    //连接失败
    connect(sock,&QTcpSocket::disconnected,[this](){
        QMessageBox::warning(this,"连接提示","网络断开");
    });
}

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

void Widget::on_ConnectButton_clicked()
{
    //连接ip地址和窗口
    QString Ipaddr = ui->iplineEdit->text();
    QString Port = ui->PortlineEdit->text();
    //连接服务器
    sock->connectToHost(QHostAddress(Ipaddr),Port.toShort());
}

void Widget::on_CloseButton_clicked()
{
    this->close();
}

三、最终成果

请添加图片描述

四、对于线程信号的理解

线程这个逻辑流程,就是首先子客户端建立连接,之后将信号传入线程函数,发射信号,传入服务器进程处理

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:37:39  更:2022-08-19 19:39:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 20:24:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计