TCP通信软件开发--Qt

软件功能描述

(1)TCP server 实现根据 “IP地址” 和 “端口号” 开启服务器,监听连接,收发数据功能。
(2)TCP client 实现根据 “IP地址” 和 “端口号” 连接服务器,收发数据功能。

目前只实现了一对一通信,只能有一个client,可通过动态创建socket的方式实现多个client。

实现步骤

创建工程

开发环境:Qt Creator 5.12.8 qt-opensource-windows-x86-5.12.8
下图中没展示的步骤使用默认设置即可。

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

添加client

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在就有了两个ui
在这里插入图片描述

ui设计

Server 界面:

在这里插入图片描述

Client界面:
在这里插入图片描述

控制程序

TCP.pro

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    client.cpp \
    main.cpp \
    server.cpp

HEADERS += \
    client.h \
    server.h

FORMS += \
    client.ui \
    server.ui

CONFIG += c++11


# Default rules for deployment.
qnx: target.path = /tmp/$${
    
    TARGET}/bin
else: unix:!android: target.path = /opt/$${
    
    TARGET}/bin
!isEmpty(target.path): INSTALLS += target

client.h

#ifndef CLIENT_H
#define CLIENT_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

namespace Ui {
    
    
class Client;
}

class Client : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit Client(QWidget *parent = nullptr);
    ~Client();

private:
    Ui::Client *ui;
    //QTcpServer* server;//监听的套接字
    QTcpSocket* client;//通信的套接字
};

#endif // CLIENT_H

server.h

#ifndef SERVER_H
#define SERVER_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Server; }
QT_END_NAMESPACE

class Server : public QWidget
{
    
    
    Q_OBJECT

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

private:
    Ui::Server *ui;
    QTcpServer* server;//监听的套接字
    QTcpSocket* conn;//通信的套接字
};
#endif // SERVER_H

client.cpp

#include "client.h"
#include "ui_client.h"

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

    //ui init
    ui->IP->setText("192.168.50.116");
    ui->PORT->setText("12321");
    ui->state->setText("状态:未连接");

    connect(ui->Connect, &QPushButton::clicked, this, [=]()
    {
    
    
        // init
        client = new QTcpSocket(this);
        //连接服务器
        client->connectToHost(QHostAddress(ui->IP->text()),ui->PORT->text().toInt());
        ui->state->setText("状态:已连接");
        ui->record->append("已连接到服务器---IP:" + ui->IP->text() + "  端口:" + ui->PORT->text());

        //接收数据
        connect(client, &QTcpSocket::readyRead, this, [=]()
        {
    
    
            QByteArray array = client->readAll();
            ui->record->append("Server: " + array);
        });
        //发送
        connect(ui->send, &QPushButton::clicked, this, [=]()
        {
    
    
            //发送数据
            client->write(ui->msg->toPlainText().toUtf8());
            ui->record->append("Client: " + ui->msg->toPlainText());
            //clear
            //ui->textEdit_2->clear();
        });

    });
}

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

server.cpp

#include "server.h"
#include "ui_server.h"

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

    //ui init
    ui->IP->setText("192.168.50.116");
    ui->PORT->setText("12321");
    ui->state->setText("状态:未开启");

    connect(ui->OpenServer, &QPushButton::clicked, this, [=]()
    {
    
    
        //实例化
        server = new QTcpServer(this);
        //监听
        server->listen(QHostAddress(ui->IP->text()),ui->PORT->text().toInt());
        ui->state->setText("状态:已开启");

        //新的连接
        connect(server, &QTcpServer::newConnection, this, [=]()
        {
    
    
            //接收客户端的套接字对象accept
            // sock_addr 结构体 == 类 QTcpSocket
            conn = server->nextPendingConnection();
            QString str;
            ui->record->append("客户端接入---IP: " + conn->peerAddress().toString() +"  端口:"+ str.sprintf("%d", (conn->peerPort())));

            //接收数据
            connect(conn, &QTcpSocket::readyRead, this, [=]()
            {
    
    
                QByteArray array = conn->readAll();
                ui->record->append("Client: " + array);
            });

        });

        //发送
        connect(ui->send, &QPushButton::clicked, this, [=]()
        {
    
    
            //发送数据
            conn->write(ui->msg->toPlainText().toUtf8());
            //char data[1024];data[0]=0xeb;data[1]=0x90;
            //conn->write(data,1024);
            ui->record->append("Server: " + ui->msg->toPlainText());
            //clear
            //ui->textEdit_2->clear();
        });
    });

}

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


main.cpp

#include "server.h"
#include "client.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    Server w;
    w.setWindowTitle("TCP Server");
    w.show();

    Client c;
    c.setWindowTitle("TCP Client");
    c.show();

    return a.exec();
}

界面展示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/meng1506789/article/details/108962456