参考
QT实现UDP通信(原版例子!!!)
Singals & Slots(官方文档)
Qt入门之信号与槽机制
Qt 信号槽的实现
Qt学习 之 Socket通信
Qt的Socket数据通讯的一个例子
Qt 下的udp socket通信示例(要下载的完整Qt工程)
CSDN-markdown语法之如何插入图片(乱入…)
目标
终极目标是完成计网课设:基于P2P的局域网即时通信系统。
然而…第一次接触 Qt,完全没有概念,希望有个尽量简单的例子见识一下 Qt 网络编程的套路。看完参考的例子后学写了一波。
特点
- 只有一边发送、另一边接收,且都在本地
- 没有图形界面,就黑框框
Tips
- Qt 版本:5.8
- .pro 文件里要加一句:
QT += network
,接着一定要 执行qmake - 约定用 2333 号端口(随便啦)
- 测试时要在本机启动两个程序,就把发送端和接收段放在两个工程里,分别置为活动工程、运行,就可以启动两个了
- singals 和 slots 其实就是普通的成员函数,见上面 Qt 信号槽的实现 的链接中带有魔法的宏
bind()
大概是使用那个端口的意思,就从那端口读数据- 一旦端口收到数据,就会
emit
一个叫readyRead()
的信号,然后那些connect()
了readyRead()
的槽(例中的receive()
)就会收到通知(被调用),然后进行相应的操作(函数体)
源码
发送端
main.cpp
#include <QByteArray>
#include <QCoreApplication>
#include <QHostAddress>
#include <QUdpSocket>
const quint16 PORT = 2333;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QUdpSocket qus;
// qus.bind(QHostAddress("127.0.0.1"), PORT+1);
QByteArray msg = "Hello world!";
std::cout << "--- Sender ---" << std::endl;
for(int i=0; i<100; ++i)
qus.writeDatagram(msg, QHostAddress("127.0.0.1"), PORT);
return a.exec();
}
接收端
UdpReceiver.h
#ifndef UDPRECEIVER_H
#define UDPRECEIVER_H
#include <QObject>
#include <QUdpSocket>
class UdpReceiver : public QObject
{
Q_OBJECT
public:
UdpReceiver(QObject *p = 0);
~UdpReceiver();
public slots:
void receive();
private:
QUdpSocket *uSocket;
};
#endif // UDPRECEIVER_H
UdpReceiver.cpp
#include <QByteArray>
#include <iostream>
#include "UdpReceiver.h"
const quint16 PORT = 2333;
UdpReceiver::UdpReceiver(QObject *p) :
QObject(p)
{
uSocket = new QUdpSocket;
uSocket->bind(QHostAddress("127.0.0.1"), PORT);
connect(uSocket, SIGNAL(readyRead()), this, SLOT(receive()));
}
UdpReceiver::~UdpReceiver()
{
delete uSocket;
}
void UdpReceiver::receive()
{
QByteArray ba;
while(uSocket->hasPendingDatagrams())
{
ba.resize(uSocket->pendingDatagramSize());
uSocket->readDatagram(ba.data(), ba.size());
std::cout << ba.data() << std::endl;
}
}
main.cpp
#include <QCoreApplication>
#include "udpreceiver.h"
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
UdpReceiver ur;
std::cout << "--- Recevier ---" << std::endl;
return a.exec();
}