目标
终极目标是完成计网课设:基于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;
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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
接收端
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
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();
}
截图
工程
qmake
效果