QT socket网络编程

QT socket网络编程QTsocket

全是自我理解,如有错误的地方可留言提示,谢谢!

开发工具:QT Creator

前提:

1.创建两个项目:server client

2.在两个项目的.pro文件中添加network

QT       += core gui network

socket原理:

server端

1.server端创建QTcpServer对象,绑定地址和端口

2.启动监听,接收客户连接请求

3.接收到客户端连接请求后,获得此次连接的新套接字,建立了连接

4.通过套接字进行相互通信

5.关闭套接字

client端

1.创建套接字

2.向服务器发送请求

3.和server进行通信

4.关闭套接字

代码:

以下代码仅支持一对一,多个客户端连接同一个服务器时,server需创建

QList<QTcpSocket*> socketList用以保存每个接入的客户端套接字

server端

.h文件

#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_bt_enter_clicked();
    void new_connect();

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

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Server");
    server = new QTcpServer(this);
    server->listen(QHostAddress::Any, 8080);
    connect(server, &QTcpServer::newConnection, this, &Widget::new_connect);
}

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


void Widget::on_bt_enter_clicked()
{
    QString str = ui->send_mess->text();
    socket->write(str.toUtf8());
}

void Widget::new_connect()
{
    //获取套接字
    socket = server->nextPendingConnection();
    ui->lb_conn->setText("连接成功");
    connect(socket, &QTcpSocket::readyRead, this ,[=](){
        QString data = socket->readAll();
        ui->receive_mess->setText(data);
    });
    connect(socket, &QTcpSocket::disconnected, this, [=](){
        ui->lb_conn->setText("无连接");
        socket->close();
        socket->deleteLater();
    });
}

client端

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>

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 readMessage();
    void on_bt_conn_clicked();

    void on_bt_disconn_clicked();

    void on_bt_send_clicked();

    void on_bt_all_clicked();

    void on_bt_clear_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *socket;
    QList<QString> DataList;
    QString message;
    quint16 blockSize;

};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Client");
    socket = new QTcpSocket(this);
    ui->le_ip->setText("127.0.0.1");
    ui->le_port->setText("8080");

    connect(socket, &QTcpSocket::readyRead, this, &Widget::readMessage);

    connect(socket,&QTcpSocket::disconnected, this, [=](){
        ui->lb_conn->setText("断开连接");
    });
    connect(socket, &QTcpSocket::connected, this,[=](){
        ui->lb_conn->setText("已连接");
    });
}

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

void Widget::readMessage()
{
    QString message=socket->readAll();
    DataList.push_back(message);
    ui->le_receive->setText(message);
}


void Widget::on_bt_conn_clicked()
{
    socket->connectToHost(ui->le_ip->text(),
                          ui->le_port->text().toInt());
}

void Widget::on_bt_disconn_clicked()
{
    socket->disconnectFromHost();
}

void Widget::on_bt_send_clicked()
{

    QString str = ui->le_send->text();
    socket->write(str.toUtf8());
}

void Widget::on_bt_all_clicked()
{
    QString str;
    for (auto mess:DataList){
        str += mess + '\n';
    }
    QMessageBox::information(nullptr, "信息", str);
}

void Widget::on_bt_clear_clicked()
{
    DataList.clear();
    QMessageBox::information(nullptr, "信息", "已清空");
}

效果图

QT socket网络编程QT socket网络编程

 参考博客

Qt 基于TCP的Socket编程 – 一杯清酒邀明月 – 博客园 (cnblogs.com)

 

 

今天的文章QT socket网络编程分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28497.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注