QT基于TCP协议socket相互通信

开发工具:QT Creator

原理:

server端:

        1、server端创建QTcpServer对象,绑定ip和端口;

        2、启动监听,接收客户端连接请求;

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

        4、通过套接字进行相互通信;

        5、关闭套接字;

client端:

        1、创建套接字;

        2、向服务器发起连接请求;

        3、通过套接字和服务器进行通信;

        4、关闭套接字;

第一步:创建一个项目TCP;

第二步:在项目的.pro文件中添加network

QT       += core gui network

第三步:添加资源文件Resources并且添加需要的资源;

第四步:设置主界面相应控件

1、Widget.ui

2、Widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QMessageBox>
#include <QHostAddress>
#include "server.h"
#include "ui_server.h"
#include "client.h"
#include "ui_client.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:

    void on_b_server_client_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

3、Widget.cpp

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

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

    this->setWindowTitle("TCP");
    this->setWindowIcon(QIcon(":/TCP.png"));
    this->setFixedSize(600,400);
}

Widget::~Widget()
{
    delete ui;
}
//同时打开服务器和客户端
void Widget::on_b_server_client_clicked()
{
    server *server_win = new server;
    server_win->show();                 //打开服务器窗口
    client *client_win = new client;
    client_win->show();                 //打开客户端窗口
    this->close();                      //关闭当前窗口
}

第五步:添加服务器的相应文件server.ui、server.h、server.cpp

1、server.ui

 

2、server.h

#ifndef SERVER_H
#define SERVER_H

#include "widget.h"
#include "ui_widget.h"
#include <QWidget>

namespace Ui {
class server;
}

class server : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_b_send_clicked();
    void new_connect();
    void on_b_return_clicked();

private:
    Ui::server *ui;

    QTcpServer *myserver;
    QTcpSocket *socket;
};

#endif // SERVER_H

3、server.cpp

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

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

    this->setWindowTitle("服务器");
    this->setWindowIcon(QIcon(":/服务器.png"));
    this->setFixedSize(600,400);

    myserver = new QTcpServer(this);
    myserver->listen(QHostAddress::Any,8888);
    connect(myserver,&QTcpServer::newConnection,this,&server::new_connect);
}

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

void server::on_b_send_clicked()
{
    QString str = ui->lineEdit_send->text();
    socket->write(str.toUtf8());
}

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

void server::on_b_return_clicked()
{
    Widget *win = new Widget;
    win->show();                //打开主界面窗口
    this->close();              //关闭当前窗口
}

第六步:添加服务器的相应文件client.ui、client.h、client.cpp

1、client.ui

2、client.h

#ifndef CLIENT_H
#define CLIENT_H

#include <QWidget>
#include "widget.h"
#include "ui_widget.h"
namespace Ui {
class client;
}

class client : public QWidget
{
    Q_OBJECT

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

private slots:
    void readMessage();
    void on_b_conn_clicked();
    void on_b_disconn_clicked();
    void on_b_send_clicked();
    void on_b_all_clicked();
    void on_b_clear_clicked();
    void on_b_return_clicked();

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

#endif // CLIENT_H

3、client.cpp

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

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

    this->setWindowTitle("客户端");
    this->setWindowIcon(QIcon(":/客户端.png"));
    this->setFixedSize(600,400);

    socket = new QTcpSocket(this);
    ui->lineEdit_IP->setText("127.0.0.1");
    ui->lineEdit_port->setText("8888");

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

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

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

void client::on_b_conn_clicked()
{
    socket->connectToHost(ui->lineEdit_IP->text(),
                          ui->lineEdit_port->text().toInt());
}

void client::on_b_disconn_clicked()
{
    socket->disconnectFromHost();
}

void client::on_b_send_clicked()
{
    QString str = ui->lineEdit_send->text();
    socket->write(str.toUtf8());
}

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

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

void client::on_b_return_clicked()
{
    Widget *win = new Widget;
    win->show();                //打开主界面窗口
    this->close();              //关闭当前窗口
}

第七步:运行效果图

1、主界面

 2、点击”打开服务器和客户端“按钮,进行连接和相互通信

 

猜你喜欢

转载自blog.csdn.net/qq_72714790/article/details/127967912