Qt学习笔记-简单的TCP程序

运行截图如下:



代码如下:

客户端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QAbstractSocket>
class QTcpSocket;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QString m_message;
    QTcpSocket *m_tcpSocket;
    quint16 m_blockSize;  //存放数据大小

private slots:
    void newConnect();
    void readMessage();
    void displayError(QAbstractSocket::SocketError);
    void connectBtnClicked();

};

#endif // WIDGET_H

widget.cpp

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_tcpSocket=new QTcpSocket(this);
    connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::readMessage);
    connect(m_tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
    connect(ui->connectPushButton,&QPushButton::clicked,this,Widget::connectBtnClicked);
}

void Widget::newConnect(){
    m_blockSize=0;
    m_tcpSocket->abort();
    m_tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());
}

void Widget::readMessage(){
    QDataStream in(m_tcpSocket);
    in.setVersion(QDataStream::Qt_5_7);
    if(m_blockSize==0){
        if(m_tcpSocket->bytesAvailable()<(int)sizeof(quint16))
            return;
        in>>m_blockSize;
    }
    if(m_tcpSocket->bytesAvailable()<m_blockSize) return;
    in>>m_message;
    qDebug()<<"message:"<<m_message;
    ui->listWidget->insertItem(0,m_message);
}

void Widget::displayError(QAbstractSocket::SocketError){
    qDebug()<<m_tcpSocket->errorString();
}

void Widget::connectBtnClicked(){
    newConnect();
}

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

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}


服务端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QTcpServer;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

    QTcpServer *m_tcpServer;

private slots:
    void sendMessage();
};

#endif // WIDGET_H

widget.cpp

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_tcpServer=new QTcpServer(this);
    if(!m_tcpServer->listen(QHostAddress::LocalHost,10086)){
        qDebug()<<m_tcpServer->errorString();
        close();
    }
    connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::sendMessage);
}

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

void Widget::sendMessage()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_7);
    out<<(quint16)0;
    out<<QString::fromUtf8("你妹");
    out.device()->seek(0);
    out<<(quint16)(block.size()-sizeof(quint16));

    QTcpSocket *clientConnection=m_tcpServer->nextPendingConnection();
    connect(clientConnection,&QTcpSocket::disconnected,clientConnection, &QTcpSocket::deleteLater);
    clientConnection->write(block);
    clientConnection->disconnectFromHost();
    ui->label->setText("发送数据成功");
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80602233