一直以来大家都是用TCP/IP通信的 或者是用端口进行通信的,上周末没事写了一个UDP 相当于局域网广播通信。
废话少说直接贴代码 ,可以传输英文 中文今天调通了
发送之前做中文处理,接收之后也需要做一下正文处理(utf8)
环境:qt5.3.2 win8 64位
一、UDPclient(头文件和源文件)
头文件:
#ifndef MAINDIALOG_H
#define MAINDIALOG_H
#include <QDialog>
#include <QtNetwork/QUdpSocket>
#include <QTextCodec>
namespace Ui {
class MainDialog;
}
class MainDialog : public QDialog
{
Q_OBJECT
public:
explicit MainDialog(QWidget *parent = 0);
~MainDialog();
private slots:
void on_startPushButton_clicked();
private:
Ui::MainDialog *ui;
QUdpSocket* udpSocket;
};
#endif // MAINDIALOG_H
源文件:
#include "maindialog.h"
#include "ui_maindialog.h"
#include <QString>
#include <QTextCodec>
#include <QDebug>
MainDialog::MainDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MainDialog)
{
ui->setupUi(this);
this->setWindowTitle(tr("局域网广播"));
udpSocket = new QUdpSocket(this);
}
MainDialog::~MainDialog()
{
delete ui;
}
void MainDialog::on_startPushButton_clicked()
{
QString sendDats = ui->senderDatasTextEdit->toPlainText();
QString port = ui->connectPortLineEdit->text();
QByteArray sendByte = sendDats.toUtf8();
qDebug()<<sendDats;
udpSocket->writeDatagram(sendByte,QHostAddress::LocalHost,port.toInt());
}
二、UDPService
头文件:
#ifndef SERIVEDIALOG_H
#define SERIVEDIALOG_H
#include <QDialog>
#include <QtNetwork/QUdpSocket>
#include <QDebug>
#include <QTextCodec>
namespace Ui {
class SeriveDialog;
}
class SeriveDialog : public QDialog
{
Q_OBJECT
public:
explicit SeriveDialog(QWidget *parent = 0);
~SeriveDialog();
public slots:
void dealWithTheDate();
private slots:
void on_startRecvPushButton_clicked();
private:
Ui::SeriveDialog *ui;
QUdpSocket* udpsocket;
QString port;
};
#endif // SERIVEDIALOG_H
源文件:
#include "serivedialog.h"
#include "ui_serivedialog.h"
SeriveDialog::SeriveDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SeriveDialog)
{
ui->setupUi(this);
udpsocket = new QUdpSocket(this);
this->setWindowTitle(tr("局域网广播"));
}
SeriveDialog::~SeriveDialog()
{
delete ui;
}
void SeriveDialog::dealWithTheDate()
{
QByteArray recvDatas;
if(udpsocket->hasPendingDatagrams())
{
recvDatas.resize(udpsocket->pendingDatagramSize());
udpsocket->readDatagram(recvDatas.data(),recvDatas.size());
}
qDebug()<<recvDatas;
// ui->textBrowser->append(recvDatas);
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
//QTextCodec* codec = QTextCodec::codecForName("GB18030");
QString all = codec->toUnicode(recvDatas);
qDebug()<<all;
// 显示在text上
ui->textBrowser->append(all);
}
void SeriveDialog::on_startRecvPushButton_clicked()
{
port = ui->protLineEdit->text();
udpsocket->bind(QHostAddress::LocalHost,port.toInt());
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(dealWithTheDate()));
}
三、效果:
先运行服务器