Qt之局域网UDP通讯

                      欢迎关注公众号可以查看更多完整文章

 

创建两个QUdpSocket对象,一个用来发送数据,一个用来接收数据。发送数据的QUdpSocket需要绑定本机IP和端口,要不然是收不到数据的。

界面最上面的IP输入框是发送到的对方IP地址。中间是显示收到数据。下面的输入框是用来发送数据的。

在虚拟机中和本机通讯:

Qt没有IP输入框,需要自己去封装,也可以网上下载。我前面也发了一个自己封装的IP输入框,功能大部分和Windows IP输入框差不多,个别地方需要微修改一下。

主要程序:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>
#include <QLineEdit>
#include <QPushButton>

class CIPLineEdit;
namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
	
	CIPLineEdit *m_pIPLineEdit;

    QUdpSocket *m_rcvSocket;
	QUdpSocket *m_sendSocket;
private slots:
    void send();
    void receive();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QTextCodec>
#include "iplineedit.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MainWindow::setWindowTitle(tr("UDP"));

    m_pIPLineEdit = new CIPLineEdit(this);
    m_pIPLineEdit->setGeometry(45, 25, 120, 26);
	m_rcvSocket = new QUdpSocket(this);
	ui->label_IP->setText("ToIP");
	QString ipAddress;
	QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
	for (int i = 0; i < ipAddressesList.size(); ++i)
	{
		if (ipAddressesList.at(i) != QHostAddress::LocalHost &&	ipAddressesList.at(i).toIPv4Address())
		{
			ipAddress = ipAddressesList.at(i).toString();
			break;
		}
	}
	bool conn = m_rcvSocket->bind(QHostAddress(ipAddress), 6660, QUdpSocket::ShareAddress);
	if (!conn)
		conn = m_rcvSocket->bind(QHostAddress("127.0.0.1"), 6660, QUdpSocket::ShareAddress);

	if (conn)
	{
		connect(ui->send, SIGNAL(clicked()), this, SLOT(send()));
		connect(m_rcvSocket, SIGNAL(readyRead()), this, SLOT(receive()));
	}

    m_sendSocket = new QUdpSocket(this);
}

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

//发送消息
void MainWindow::send()
{
	QString qs = ui->textSend->toPlainText();
	QTextCodec *codec = QTextCodec::codecForName("GB2312");
	QByteArray byte = codec->fromUnicode(qs);
	if (qs.isEmpty())
		return;
	m_sendSocket->writeDatagram(byte.data(), byte.length(), QHostAddress(m_pIPLineEdit->GetIP()), 6660);
	ui->textSend->clear();
}

//接收消息并显示
void MainWindow::receive()
{
    QHostAddress addr;
    quint16 port;

    while(m_rcvSocket->hasPendingDatagrams())
    {
        QByteArray qb;
		qb.resize(m_rcvSocket->pendingDatagramSize());
		m_rcvSocket->readDatagram(qb.data(), qb.size(), &addr, &port);
        QTextCodec *codec = QTextCodec::codecForName("GB2312");
        QString str = codec->toUnicode(qb);
		QString qStrIP = addr.toString();

		if (qb.size())
        {
            ui->textReceive->append(qStrIP + " said:\n");
            ui->textReceive->insertPlainText(str);
        }
    }
}

qq:1245178753
本文地址:Qt之局域网UDP通讯_GreenArrowMan-CSDN博客-CSDN博客

源码下载:Qt之UDP通讯-C++代码类资源-CSDN下载

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenArrowMan

请打钱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值