首页 > 其他分享 >TCP客户端&服务端QT开发

TCP客户端&服务端QT开发

时间:2023-11-13 09:33:51浏览次数:26  
标签:Widget socket void TCP myThread ui QTcpSocket 服务端 QT

TCP客户端&服务端QT开发

TCP Client

1.Widget类写UI界面,创建socket对象

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

    socket = new QTcpSocket;    //创建socket对象
}

2.取消按键槽函数

// 直接关闭窗口即可
void Widget::on_cancelButton_clicked()
{
    this->close();
}

3.连接按键槽函数

3.1获取ip和port

// 获取ip地址和端口号
QString ip = ui->ipLineEdit->text();
QString port = ui->portLineEdit->text();

3.2连接服务器

socket第一个参数,QString->QHostAddress;第二个参数QString->short.

// 连接服务器
socket->connectToHost(QHostAddress(ip), port.toShort());

3.3连接成功,发出信号

指向新页面,同时堆区创建指针,避免该进程结束后自动回收相关的成员函数和局部变量,同时传入socket变量进入chat类中。

// 连接服务器成功,socket对象发出信号
connect(socket, &QTcpSocket::connected, [this]()
{
    QMessageBox::information(this, "连接提示", "连接服务器成功");

    this->hide();
    Chat *c = new Chat(socket);     //堆空间创建
    c->show();
});

3.4连接失败,发出信号

// 连接一异常, socket发出信号
connect(socket, &QTcpSocket::disconnected, [this]()
{
    QMessageBox::warning(this, "连接提示", "连接异常,网络断开");
});

4.Chat类写UI界面,接收socket参数

构造函数,传入socket内容

###---chat.h---###
class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_cancelButton_clicked();

    void on_connetButton_clicked();

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

###---chat.c---###
Chat::Chat(QTcpSocket *s, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Chat)
{
    ui->setupUi(this);
    socket = s;
}

5.清空发送文本槽函数

void Chat::on_clearButton_clicked()
{
    ui->lineEdit->clear();
}

6.发送槽函数

socket->write()函数封装好了,要求发送数据为QByteArray格式。

void Chat::on_sendButton_clicked()
{
    QByteArray ba;
    ba.append(ui->lineEdit->text());
    socket->write(ba);
}

TCP Sever

1.Widget类写UI界面,创建QTcpServer对象

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);
}

2.服务端处理槽函数

建立连接 ----> 启动线程(服务端多线程),传入socket参数

void Widget::newClientHandler()
{
    // 建立TCP连接
    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); //创建线程对象
    t->start();                        //开始线程

    connect(t, &myThread::sendToWidget, this, &Widget::threadSlot);
}

3.线程类

3.1初始化

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

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

3.2槽函数

void myThread::clientInfoSlot()
{
    // 不能在其他类里操作界面
    //qDebug() << socket->readAll();
    QByteArray ba = socket->readAll();
    emit sendToWidget(ba);      //发送信号,信号中带参数
}

3.3自定义信号

class myThread :  public QThread
{
    Q_OBJECT
public:
    explicit myThread(QTcpSocket *s);
    void run();

signals:
    void sendToWidget(QByteArray b);


public slots:
    void clientInfoSlot();

private:
    QTcpSocket *socket;

};

3.4显示槽函数

void Widget::threadSlot(QByteArray b)
{
    ui->mainLineEdit->setText(QString(b));
}

成果展示

连接:

连接

多线程:
多线程

标签:Widget,socket,void,TCP,myThread,ui,QTcpSocket,服务端,QT
From: https://www.cnblogs.com/ZhengBlogs/p/qtTCP.html

相关文章

  • ??TCP协议:三次握手、四次挥手,你真的了解吗?
    什么是TCP网络分层应⽤层应用层是网络协议栈中的最顶层,主要负责应用程序之间的通信。其中一种常见的应用层协议是HTTP协议,它定义了应用程序之间如何传递报文。传输层传输层是为两台主机之间的应用进程提供端到端的逻辑通信的层级。其中一种常见的传输层协议是TCP协议,它负责可......
  • Qt各版本官方下载地址
    20200706  Qt5.15开始,无论是开源版还是商业版都采用了在线安装的方式。不再提供离线包。如自己使用可下载一次之后将下载文件备份即可在线安装器下载地址:http://download.qt.io/official_releases/online_installers/记录下Qt各版本的下载地址,便于后期查找及下载1.所有Qt......
  • pyqt qlabel hide
    pyqt qlabel hide fromPyQt5.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QLabelclassMyApp(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):self.layout=QVBoxLayout()s......
  • Qt 之 QDebug,QString
    @TOC前言一、QDebugQDebug是Qt中用于进行调试和输出日志的类。它提供了一种便捷的方式来输出各种类型的数据,并可轻松地与流式输出一起使用,方便调试和查看程序的运行情况。引入QDebug:在使用QDebug之前,需要引入头文件<QDebug>。通常,在Qt的源文件中已经包含了头文件,所以无需额外引......
  • Powershell 实现telnet 服务端
    Write-Host"这是一个简单的TCP服务器,用于监听指定的端口,并接收来自客户端的数据。"Write-Host"客户端请使用telnetIP+端口的方式连接至服务器"Write-Host"目前同时只支持单个客户端,请勿连接多个客户端,会导致程序运行异常"Write-Host"作者:ID404"Write-Host"版本:1.0"......
  • QT图片缩小放大显示实践
    QT图片缩小放大显示实践在这里使用QLable加载gif或png进行显示测试,图片格式为png可以用QPixmap加载显示,如果格式为gif加载后又想让其动起来,需要用QMovie静态图片测试使用QLabel的setScaledContents缩放方法进行测试,看到是整体的拉伸填充满的QPixmappng=QPixmap(":res/2.png"......
  • Redis服务端优化
    持久化配置Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:①用来做缓存的Redis实例尽量不要开启持久化功能②建议关闭RDB持久化功能,使用AOF持久化③利用脚本定期在slave节点做RDB,实现数据备份④设置合理的rewrite阈值,避免频繁的bgrewrite⑤......
  • 网络协议分析——实验九使用Wireshark分析TCP协议
    网络协议分析——实验九使用Wireshark分析TCP协议文章在线:https://www.cnblogs.com/rabbit-dayi/p/17826075.htmlhttps://type.dayiyi.top/index.php/archives/246/https://blog.dayi.inkhttps://cmd.dayi.ink/mXYpwNZfQXSEJWKHCoYAFg?both实验目的本实验旨在使用Wiresh......
  • pyqt5-自定义函数优化管理组件
    1、介绍pyqt本身提供了诸多的方法和事件特性,可以操作ui组件。对于单一的项目或者说具有个人风格的开发者来说,在此基础上进行整合可以优化代码。整合,这里特指的是ui组件。可能是ui的显示和初始化,也可能是相关的业务代码。2、测试和总结函数中的ui组件可以调用设置值或获取的......
  • pyqt5-自定义类管理组件
    1、直接定义类,类对象作为XxWindowClass的属性,和self.window并列。将self.window的部分组件赋值给自定义类的属性,完成同步。经测试,此时自定义类的对象中可以读取和操作ui组件。但是无法进行事件设置,设置无效。2、解决方法目前有两个解决方法2.1继续1的做法,自定义类的对象与sel......