Qt-socket网络

qt-socket

/* .pro文件 */
QT += network

tcp

服务端

/* widget.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:
    Ui::Widget *ui;

    QTcpServer *servSock;
    QTcpSocket *listenSock;

private slots:
    void myGetNewConnect();
    void myGetNewRead();

    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
};
#endif // WIDGET_H

/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"

#include <QByteArray>

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

    // 设置默认值
    ui->lineEdit->setText("127.0.0.1"); // ip
    ui->lineEdit_2->setText("8080"); // port

    // 创建套接字
    servSock=new QTcpServer(this);
    listenSock=new QTcpSocket(this);

    ui->pushButton->setEnabled(false);

    /* == version 1 == */
    // 监听ip+port
//    servSock->listen(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());

//    connect(servSock,&QTcpServer::newConnection,this,&Widget::myGetNewConnect);

    // ERROR!!! 必须保证已经建立连接了才能接收数据 建立信号和槽
//    connect(listenSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead); // 在这创建信号和槽是错的
}

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


void Widget::myGetNewConnect()
{
    // 返回一个套接字
    listenSock=servSock->nextPendingConnection();
    ui->textEdit->append("accept client socket connect request...");

    // 必须在这创建信号和槽函数
    connect(listenSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead);
}

void Widget::on_pushButton_clicked()
{
    if (!listenSock->isOpen())
    {
        ui->textEdit->append("ERROR: no connect is usable...");
        return;
    }
    QString sendText=ui->textEdit_2->toPlainText();
    QByteArray sendArray=sendText.toUtf8();
    listenSock->write(sendArray);

    ui->textEdit->append("server to client: ");
    ui->textEdit->append(sendText);
}

void Widget::myGetNewRead()
{
    QByteArray readArray=listenSock->readAll();
    ui->textEdit->append("client to server:");
    ui->textEdit->append(readArray);
}


void Widget::on_pushButton_2_clicked()
{
    /* == version 2 == */
    servSock->listen(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());
    connect(servSock,&QTcpServer::newConnection,this,&Widget::myGetNewConnect);

    ui->pushButton_2->setEnabled(false);
    ui->pushButton->setEnabled(true);
}

在这里插入图片描述

客户端

/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#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_pushButton_clicked();
    void myGetNewRead();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *clientSock;
};
#endif // WIDGET_H

/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QDebug>

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

    ui->lineEdit->setText("127.0.0.1");
    ui->lineEdit_2->setText("8080");
    clientSock=new QTcpSocket(this);

    connect(clientSock,&QTcpSocket::readyRead,this,&Widget::myGetNewRead);
}

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


void Widget::on_pushButton_clicked()
{
    clientSock->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toUInt());
    ui->textEdit->append("connect server: "+ui->lineEdit->text()+":"+ui->lineEdit_2->text());
}


void Widget::myGetNewRead()
{
    QByteArray readArray=clientSock->readAll();
    ui->textEdit->append("server to client:");
    ui->textEdit->append(readArray);
}

void Widget::on_pushButton_2_clicked()
{
    if (!clientSock->isOpen())
    {
        ui->textEdit->append("ERROR: not connect the server");
        return ;
    }

    QString sendText=ui->textEdit_2->toPlainText();
    QByteArray sendArray=sendText.toUtf8();
    clientSock->write(sendArray);

    ui->textEdit->append("client to server: ");
    ui->textEdit->append(sendText);
}

在这里插入图片描述

udp

接收端

/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>

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_pushButton_2_clicked();
    void myGetNewRead();

    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    QUdpSocket *recvSock;
    QHostAddress sendAddress;
    quint16 sendPort;
};
#endif // WIDGET_H

/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>

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

    ui->lineEdit->setText("127.0.0.1");
    ui->lineEdit_2->setText("8080");
    ui->lineEdit_3->setText("127.0.0.1");


    setWindowTitle("receiver");
    recvSock=new QUdpSocket(this);
    connect(recvSock,&QUdpSocket::readyRead,this,&Widget::myGetNewRead);
}

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


void Widget::on_pushButton_2_clicked()
{
    // 绑定端口号
    recvSock->bind(QHostAddress::LocalHost,ui->lineEdit_2->text().toUInt());
    ui->textEdit->append("bind "+ui->lineEdit->text()+":"+ui->lineEdit_2->text());
}

void Widget::myGetNewRead()
{
    QByteArray recvArray;
    // version 1
    // pendingDatagramSize 表示收到的数据的大小
    long recvSize=recvSock->pendingDatagramSize();
    recvArray.resize(recvSize);

    // version 2
//    char *p_recvArray=new char[recvSize];
//    memcpy(p_recvArray,recvArray.data(),recvSize);

    recvSock->readDatagram(recvArray.data(),recvArray.size(),&sendAddress,&sendPort);

    QString info=QString("sender to receiver [%1 : %2 -> %3 : %4]").arg(sendAddress.toString()) \
            .arg(QString::number(sendPort)) \
            .arg(ui->lineEdit->text()) \
            .arg(ui->lineEdit_2->text());

    ui->textEdit->append(info);
    ui->textEdit->append(recvArray);

    ui->lineEdit_3->setText(sendAddress.toString());
    ui->lineEdit_4->setText(QString::number(sendPort));
}


void Widget::on_pushButton_clicked()
{
    QByteArray sendArray;
    sendArray=ui->textEdit_2->toPlainText().toUtf8();
    recvSock->writeDatagram(sendArray.data(),sendArray.size(),sendAddress,sendPort);
    ui->textEdit->append("receiver to sender:");
    ui->textEdit->append(sendArray);
}


在这里插入图片描述

发送端

/* widget.h */

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>

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_pushButton_2_clicked();
    void myGetNewRead();

    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QUdpSocket *sendSock;
    QHostAddress recvAddress;
    quint16 recvPort;
};
#endif // WIDGET_H

/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>
#include <QString>

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

    setWindowTitle("sender");

    ui->lineEdit->setText("127.0.0.1");
    ui->lineEdit_2->setText("8080");

    ui->lineEdit_3->setText("127.0.0.1");
    ui->lineEdit_4->setText("8088");

    sendSock=new QUdpSocket(this);
    connect(sendSock,&QUdpSocket::readyRead,this,&Widget::myGetNewRead);
}

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


void Widget::on_pushButton_2_clicked()
{
    QByteArray sendArray;
    sendArray=ui->textEdit_2->toPlainText().toUtf8();

    if (sendSock->writeDatagram(sendArray,QHostAddress(ui->lineEdit->text()),ui->lineEdit_2->text().toInt())==-1)
    {
        ui->textEdit->append("ERROR: sender to receiver");
        return ;
    }
    ui->textEdit->append("sender to receiver:");
    ui->textEdit->append(sendArray);
}


void Widget::on_pushButton_clicked()
{
    sendSock->bind(QHostAddress(ui->lineEdit_3->text()),ui->lineEdit_4->text().toUInt());
    ui->textEdit->append("bind "+ui->lineEdit_3->text()+":"+ui->lineEdit_4->text());
}

void Widget::myGetNewRead()
{
    QByteArray recvArray;
    recvArray.resize(sendSock->pendingDatagramSize());
    sendSock->readDatagram(recvArray.data(),sendSock->pendingDatagramSize(),&recvAddress,&recvPort);

    QString info=QString("receiver to sender [%1 : %2 -> %3 : %4]").arg(recvAddress.toString()) \
            .arg(QString::number(recvPort)) \
            .arg(ui->lineEdit_3->text()) \
            .arg(ui->lineEdit_4->text());
    ui->textEdit->append(info);
    ui->textEdit->append(recvArray);
}

在这里插入图片描述

其他例子

https://blog.csdn.net/qq_44386034/article/details/125637567
https://blog.csdn.net/cpp_learner/article/details/118223632

通用 - 补充例子

QString hostName=QHostInfo::localHostName();
// 打印主机名
qDebug()<<hostName;

// 本机的ip地址
QHostInfo hostInfo=QHostInfo::fromName(hostName);
// ip地址列表
QList<QHostAddress> addlist=hostInfo.addresses();

if (!addlist.isEmpty()){
    for (int i=0;i<addlist.count();i++){
        QHostAddress host=addlist.at(i);
        qDebug()<<host.protocol(); // 显示ip协议类型
        qDebug()<<host.toString(); // 显示ip
    }
}

udp - 补充例子

void Widget::socket_readData_slot(){
    QByteArray datagarm;

    QHostAddress target_ipAddress;
    quint16 target_port;

    while (udpSocket->hasPendingDatagrams()){
        datagarm.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagarm.data(),datagarm.size(),&target_ipAddress,&target_port);

        ui->plainTextEdit->appendPlainText("received datagram form IP: "+target_ipAddress.toString()+":"+QString::number(target_port));
        ui->plainTextEdit->appendPlainText(datagarm.data());
    }
}

tcp

https://blog.csdn.net/qq_40876689/article/details/113952635
https://blog.csdn.net/mitongxue/article/details/124622386
https://blog.csdn.net/object__/article/details/122821061

/*
	服务端
*/
#include <QTcpServer>
#include <QTcpSocket>

QTcpServer *tcpServer;
tcpServer = new QTcpServer(this); 

tcpServer->listen(QHostAddress::Any,6666)

//连接信号和相应槽函数,有新的连接进入是需处理
// 有新的连接接过来,会触发newConnection()信号函数,触发槽函数NewConnection()
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(NewConnection())); // 信号与槽函数

// 槽函数
void Widget::NewConnection()
{
    //初始化为0;
    //blockSize=0;
   // inBlock.resize(0);
    //新连接进入的显示处理

    // 取出连接号的套接字
    currentClient = tcpServer->nextPendingConnection();
    // QString ip=tcpsocket->peerAddress().toString();//获取连接的 ip地址
    // quint16 port=tcpsocket->peerPort();//获取连接的 端口号
    ui->statuslab->setText(tr("%1:%2").arg(currentClient->peerAddress().toString().split("::ffff:")[1]).arg(currentClient->peerPort()));

    //客户端发来数据就会触发readyRead信号
    connect(currentClient, SIGNAL(readyRead()), this, SLOT(recMessage()));
    //对方断开连接后就会触发disconnected信号
    connect(currentClient, SIGNAL(disconnected()), this, SLOT(disconnect()));
    //当有数据发送成功时,继续发送???
    connect(currentClient,SIGNAL(bytesWritten(qint64)),this, SLOT(continueSend(qint64)));
    ui->sendButton->setEnabled(true);
}

离线

QFileDialog 
QFile file(filename)
file.open(write/read)
QDataStream in(&file)
QByteArray data
in >> data

// coding...

setPixmap(QPixmap::fromImage(image))

在线

QDataStream in(client)

client->bytesAvailable()

in >> data >> string

QByteArray imagedata
imagedata +=client->readAll()

QBuffer buffer(&imagedata)
buffer.open(readtype)
QImageReader reader(&buffer,'jpg')
QImage image=reader.read()

image=image.scaled()
setPixmap(QPixmap::fromImage(image))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT socket网络编程是一种在QT框架下使用QTcpServer和QTcpSocket进行服务器和客户端通信的编程方法。首先,需要建立两个工程,一个是服务器端(server),另一个是客户端(client)。在项目的.pro文件中添加network模块,并执行qmake命令以确保能够找到socket头文件。然后,可以使用QT Designer设计界面。 在头文件中,需要包含QTcpServer和QTcpSocket的头文件,并声明相应的对象。在构造函数中,可以实例化一个QTcpSocket对象并建立连接。可以使用connectToHost方法连接到服务器的IP地址和端口号。当socket发送有内容可读的信号时,可以通过readyRead槽函数接收服务器传来的内容,并进行相应的处理。可以使用readAll方法读取所有的数据。当socket发送断开连接信号时,可以通过disconnected槽函数进行相应的处理。当socket发送连接成功信号时,可以通过connected槽函数进行相应的处理。 这样,就可以通过QT socket网络编程实现服务器和客户端之间的通信。 #### 引用[.reference_title] - *1* [qtsocket编程](https://blog.csdn.net/qq_41902325/article/details/117411471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QT socket网络编程](https://blog.csdn.net/weixin_41302262/article/details/126743928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [QTsocket网络编程](https://blog.csdn.net/weixin_47844533/article/details/124025595)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值