QT 基于TCP协议的网络通信

QT下基于TCP协议的网络通信分为服务端和客服端程序两部分,与之前写的C网络通信不同的是QT下服务器端只需要定义一个服务器对象和用来进行通信的TcpSocket,只需通过监听和连接实现与客服端的连接;客服端中需要定义一个Tcpsocket,通过connectToHost(IP,端口号)进行连接。部分源代码如下:


服务器端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 

#include    // tcp 服务器类,=====> 负责监听是否有客户端连接
#include    // tcp socket  ======> 负责tcp的通信

namespace Ui {
class widget;
}

class widget : public QWidget
{
    Q_OBJECT

public:
    explicit widget(QWidget *parent = 0);
    ~widget();
public slots:
    void newClient();
    void readData();


private:
    Ui::widget *ui;
    QTcpServer server;   //  定义一个服务器对象
};

#endif // WIDGET_H

chat.h

#ifndef CHAT_H
#define CHAT_H

#include 
#include 
#include 

namespace Ui {
class Chat;
}

class Chat : public QWidget
{
    Q_OBJECT

public:
    explicit Chat(QTcpServer *tcpServer,QWidget *parent = 0);
    ~Chat();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Chat *ui;
    QTcpSocket *s;
};

#endif // CHAT_H


widget.cpp

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


widget::widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::widget)
{
    ui->setupUi(this);
    // 监听本地的 ip 和端口
    server.listen(QHostAddress::Any, 9999);

    connect(&server, SIGNAL(newConnection()), this, SLOT(newClient()));


}


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


void widget::newClient()
{
    while(server.hasPendingConnections())   //一次接受所有客服端的请求
    {
       Chat *c = new Chat(&server);
       c->show();
       c->setAttribute(Qt::WA_DeleteOnClose);

    }
}

void widget::readData()
{

}


chat.cpp

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


widget::widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::widget)
{
    ui->setupUi(this);
    // 监听本地的 ip 和端口
    server.listen(QHostAddress::Any, 9999);

    connect(&server, SIGNAL(newConnection()), this, SLOT(newClient()));


}


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


void widget::newClient()
{
    while(server.hasPendingConnections())   //一次接受所有客服端的请求
    {
       Chat *c = new Chat(&server);
       c->show();
       c->setAttribute(Qt::WA_DeleteOnClose);

    }
}

void widget::readData()
{

}



客服端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

namespace Ui {
class widget;
}

class widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::widget *ui;
    QTcpSocket socket;           //用来和服务器进行通信
};

#endif // WIDGET_H


widget.cpp

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

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

    connect(&socket,&QTcpSocket::connected,
            [this](){
        ui->pushButton->setEnabled(true);
        ui->pushButton_2->setEnabled(false);
        QMessageBox::information(this,"连接服务器","已经连接服务器");

    });
    connect(&socket,&QTcpSocket::readyRead,
            [this]{

        while(socket.bytesAvailable())
        {
            QByteArray data = socket.readAll();
            QString str = QString("服务返回消息:%1").arg(QString(data));
            ui->textEdit->append(str);
        }


    });
}

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



void widget::on_pushButton_2_clicked()
{
    QString ip = ui->lineEdit->text();
    qint16 port=ui->lineEdit_2->text().toInt();
    socket.connectToHost(QHostAddress(ip),port);
}

void widget::on_pushButton_clicked()
{
    QString data = ui->textEdit->toPlainText();
    socket.write(data.toUtf8());
}

你可能感兴趣的:(网络)