Qt编程详解--网络通信之UDP

    一、知识储备

    使用网络模块前要先在.pro文件中添加network
    QT       += core gui network

    QUdpSocket类是Qt对UDP协议加socket的封装
    1、创建QUdpSocket类对象
    2、绑定ip地址和端口号
    3、连接readyRead()信号,当此信号发射后,就表示可以接受数据了
    4、在槽函数中调用readDatagram函数接收数据

qint64 QUdpSocket::readDatagram ( char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0 )

          host:发者的地址
          port:返回时的端口号

    5、返回数据
    

qint64 QUdpSocket::writeDatagram ( const char * data, qint64 size, const QHostAddress & address, quint16 port )

    host和port是readDatagram函数接收到的
    注意:每个QUdpSocket对象都需要绑定一个地址和端口号

二、实现 简单的聊天的功能

客户端通过下面的 lineEdit 发送数据,显示在服务端的 textEdit 上

服务端同理

 client:

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QUdpSocket* udpSocket;

private slots:
    void on_pushButton_clicked();
    void recv();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    udpSocket = new QUdpSocket;
    udpSocket->bind(QHostAddress("192.168.43.4"),6677);
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(recv()));
}

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

void Widget::recv()
{
    char buf[256] = {};
    QHostAddress sender=QHostAddress("192.168.43.4");
    quint16 port=6688;
    udpSocket->readDatagram(buf,sizeof(buf),&sender,&port);
    ui->textEdit->append(buf);
}

void Widget::on_pushButton_clicked()
{
    QString msg = ui->lineEdit->text();
    udpSocket->writeDatagram(msg.toStdString().c_str(),msg.size(),QHostAddress("192.168.43.4"),6688);
    ui->lineEdit->setText("");
}

server:

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QUdpSocket>
#include <QHostAddress>
#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    QUdpSocket* udpSocket;
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
public slots:
    void readyRead();
private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    udpSocket = new QUdpSocket;
    udpSocket->bind(QHostAddress("192.168.43.4"),6688);
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead()));
}

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

void Widget::readyRead()
{
    qDebug("-------");
    char buf[256] = {};
    QHostAddress sender;
    quint16 port;
    int ret = udpSocket->readDatagram(buf,sizeof(buf),&sender,&port);
    ui->textEdit->append(buf);
}

void Widget::on_pushButton_clicked()
{
    QString msg = ui->lineEdit->text();
    udpSocket->writeDatagram(msg.toStdString().c_str(),msg.size(),QHostAddress("192.168.43.4"),6677);
    ui->lineEdit->setText("");
}

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值