5.关于QT中的网络编程,QTcpSocket,QUdpSocket
1 新建一个项目:TCPServer.pro
A 修改TCPServer.pro,注意:如果是想使用网络库,需要加上network
SOURCES += \ TcpServer.cpp \ TcpClient.cpp HEADERS += \ TcpServer.h \ TcpClient.h QT += gui widgets network CONFIG += C++11 |
B 新建如下文件,因为要用到网络库,所以加上network
C 编写IP选择下拉选,头文件ChooseInterface.h
#ifndef CHOOSEINTERFACE_H #define CHOOSEINTERFACE_H #include <QDialog> #include <QComboBox> class ChooseInterface : public QDialog { Q_OBJECT public: explicit ChooseInterface(QWidget *parent = 0); QComboBox* _comboBox; QString _strSelect; signals: public slots: void slotComboBoxChange(QString); }; #endif // CHOOSEINTERFACE_H |
编写ChooseInterface.cpp
#include "ChooseInterface.h" #include <QNetworkInterface> #include <QVBoxLayout> ChooseInterface::ChooseInterface(QWidget *parent) : QDialog(parent) { /* get all interface */ QList<QHostAddress> addrList = QNetworkInterface::allAddresses(); #if 0 QList<QNetworkInterface> infList = QNetworkInterface::allInterfaces(); QList<QNetworkAddressEntry> entryList = infList.at(0).addressEntries(); entryList.at(0).broadcast() #endif //编写一个下拉选 _comboBox = new QComboBox; QVBoxLayout* lay = new QVBoxLayout(this); lay->addWidget(_comboBox); foreach(QHostAddress addr, addrList) { //将地址都转换成为ipv4的地址 quint32 ipaddr = addr.toIPv4Address(); //去掉0的ip if(ipaddr == 0) continue; //在comboBox中添加下拉选 _comboBox->addItem(QHostAddress(ipaddr).toString()); } //当下拉选发生变化时的操作 connect(_comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotComboBoxChange(QString))); } void ChooseInterface::slotComboBoxChange(QString str) { this->_strSelect = str; } |
上面的运行结果是:
编写TcpServer.h |
#ifndef TCPSERVER_H #define TCPSERVER_H #include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QTextBrowser> class TcpServer:public QWidget { Q_OBJECT public: explicit TcpServer(QWidget *parent = 0); QTcpServer* _server; QTcpSocket* _socket; QTextBrowser* _show; signals: public slots: void slotNetConnection(); void slotReadyRead(); }; #endif // TCPSERVER_H |
编写TcpServer.cpp |
#include "TcpServer.h" #include <QHBoxLayout> #include <QNetworkInterface> #include <QMessageBox> #include "ChooseInterface.h" TcpServer::TcpServer(QWidget *parent) : QWidget(parent) { // 创建服务器并监听 _server = new QTcpServer; ChooseInterface dlg; dlg.exec(); //消息提示框 QMessageBox::information(NULL,"you select the ip:", dlg._strSelect); _server->listen(QHostAddress(dlg._strSelect), 9988); // 当有客户端来连接时,调用slotNetConnection方法 connect(_server, SIGNAL(newConnection()), this, SLOT(slotNetConnection())); _show = new QTextBrowser; QHBoxLayout* lay = new QHBoxLayout(this); lay->addWidget(_show); } void TcpServer::slotNetConnection() { // 判断是否有未处理的连接 while(_server->hasPendingConnections()) { // 调用nextPeddingConnection去获得连接的socket _socket = _server->nextPendingConnection(); _show->append("New connection ...."); // 为新的socket提供槽函数,来接收数据 connect(_socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); } } void TcpServer::slotReadyRead() { // 接收数据,判断是否有数据,如果有,通过readAll函数获取所有数据 while(_socket->bytesAvailable() > 0) { _show->append("Data arrived ..... "); QByteArray buf = _socket->readAll(); _show->append(buf); } } |
编写TcpClient.h |
#ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QWidget> #include <QTcpSocket> #include <QLineEdit> class TcpClient:public QWidget { Q_OBJECT public: explicit TcpClient(QWidget *parent = 0); QTcpSocket* _socket; QLineEdit* _lineEdit; signals: public slots: void slotButtonClick(); }; #endif // TCPCLIENT_H |
编写TcpClient.cpp |
#include "TcpClient.h" #include <QHBoxLayout> #include <QPushButton> TcpClient::TcpClient(QWidget *parent): QWidget(parent) { _socket = new QTcpSocket(this); _socket->connectToHost("127.0.0.1", 9988); _lineEdit = new QLineEdit; QHBoxLayout* lay = new QHBoxLayout(this); lay->addWidget(_lineEdit); QPushButton* button = new QPushButton("Send"); lay->addWidget(button); connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClick())); connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotButtonClick())); } void TcpClient::slotButtonClick() { QString strText = _lineEdit->text(); if(strText.isEmpty()) return; _socket->write(strText.toUtf8()); _lineEdit->clear(); } |
MyWidget.h |
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); signals: public slots: }; #endif // MYWIDGET_H |
MyWidget.cpp |
#include "MyWidget.h" #include <QApplication> #include "TcpServer.h" #include "TcpClient.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { } int main(int argc,char** argv) { QApplication app(argc,argv); TcpServer s; s.show(); TcpClient c; c.show(); s.setWindowTitle("server"); c.setWindowTitle("client"); return app.exec(); } |
运行结果:
2 编写UDP程序
UDPServer.pro |
QT += gui widgets network CONFIG += C++11 HEADERS += \ Udp1.h \ Udp2.h \ MyWidget.h SOURCES += \ Udp1.cpp \ Udp2.cpp \ MyWidget.cpp |
Udp1.h |
#ifndef UDP1_H #define UDP1_H #include <QWidget> #include <QUdpSocket> class Udp1 : public QWidget { Q_OBJECT public: explicit Udp1(QWidget *parent = 0); QUdpSocket* _udp; signals: public slots: void slotReadyRead(); }; #endif // UDP1_H |
Udp1.cpp |
#include "udp1.h" #include <QTimer> #include <QDateTime> Udp1::Udp1(QWidget *parent) : QWidget(parent) { // 创建udpsocket,并连接槽函数,用来接收数据 _udp = new QUdpSocket; _udp->bind(10001); connect(_udp, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); // 使用定时器来定时发送时间戳 QTimer* timer = new QTimer; timer->setInterval(1000); timer->start(); connect(timer, &QTimer::timeout, [&](){ quint64 timestamp = QDateTime::currentMSecsSinceEpoch(); QString str = QString::number(timestamp); #if 0 // 普通UDPsocket发送 _udp->writeDatagram(str.toUtf8(), QHostAddress("127.0.0.1"), 10002); #else // 广播发送,注意:QHostAddress::Broadcast是255.255.255.255, 192.168.6.255 // _udp->writeDatagram(str.toUtf8(), QHostAddress::Broadcast, 10002); // multicast, 224.0.0.1~224.0.0.255 is multicast address of LAN _udp->writeDatagram(str.toUtf8(), QHostAddress("224.0.0.131"), 10002); #endif }); } void Udp1::slotReadyRead() { while(_udp->hasPendingDatagrams()) { quint32 datagramSize = _udp->pendingDatagramSize(); QByteArray buf(datagramSize, 0); _udp->readDatagram(buf.data(), buf.size()); qDebug() <<"Udp1"<< buf; } } |
Udp2.h |
#ifndef UDP2_H #define UDP2_H #include <QWidget> #include <QUdpSocket> class Udp2 : public QWidget { Q_OBJECT public: explicit Udp2(QWidget *parent = 0); QUdpSocket* _udp; signals: public slots: void slotReadyRead(); }; #endif // UDP2_H |
Udp2.cpp |
#include "udp2.h" #include <QTimer> #include <QDateTime> #include <QLineEdit> Udp2::Udp2(QWidget *parent) : QWidget(parent) { _udp = new QUdpSocket; // the address of bind and multicast must be same tpye(IPV4 or IPV6) _udp->bind(QHostAddress::AnyIPv4, 10002); // join the multicast address (224.0.0.131) for recv mulicast package _udp->joinMulticastGroup(QHostAddress("224.0.0.131")); connect(_udp, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); QTimer* timer = new QTimer(this); timer->setInterval(1000); timer->start(); connect(timer, &QTimer::timeout, [&](){ quint64 timestamp = QDateTime::currentMSecsSinceEpoch(); QString str = QString::number(timestamp); _udp->writeDatagram(str.toUtf8(), QHostAddress("127.0.0.1"), 10001); }); } void Udp2::slotReadyRead() { while(_udp->hasPendingDatagrams()) { quint32 datagramSize = _udp->pendingDatagramSize(); QByteArray buf(datagramSize, 0); _udp->readDatagram(buf.data(), buf.size()); qDebug() << "Udp2" <<buf; } } |
运行结果: 控制台输出结果如下: |
5.关于QT中的网络编程,QTcpSocket,QUdpSocket相关推荐
- Qt中的网络编程(TCP)
在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类: 可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12 常见的有: QTcpServer ...
- Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)
Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...
- Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)
Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- 学习Java第十九天(一):1、Java中的网络编程
1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...
- 网络游戏中的网络编程
谈谈网络游戏中的"网络"编程 ????近段时间总是有不少人问我关于完成端口模型的一些资料,很多时候其实我很郁闷,为什么大家会选择使用完成端口呢?或者说很多时候他们竟为了使用完成端口 ...
- Java中的网络编程类(TCPUDP)
Java中的网络编程类 n Java.net包 – TCP协议 URL URLConnection Socket ServerSocket – UDP协议 DatagramPacket Datagra ...
- Android中的网络编程-黄俊东-专题视频课程
Android中的网络编程-1902人已学习 课程介绍 剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益 每一个学员都能系统地掌握Android中的网 ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
最新文章
- raft论文 中文 pdf_八篇论文总结BERT+KG:预训练模型与知识图谱相结合的研究进展...
- 【数字信号处理】分贝的概念及其日常使用中常见的错误
- 外接显示器设置_如何为一台电脑设置两个显示器
- 最长递增字串的三种做法
- Oracle11g报bde,表现 – BDE与ADO在德尔福
- CentOS配置DHCP服务器
- [转载]网站分析的最基本度量(3)——网站分析工具如何辨别UV
- Google Python 编程风格指南
- SQL优化常用方法51
- floodlight路由机制分析
- 埃文科技教你如何验证IP地址定位的准确率
- 制作bt种子(非pt站私有种)
- Notepad软件的下载安装和使用
- matlab中tdma源程序,40MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法MATLAB源代码...
- 树莓派蜂鸣器python代码_树莓派+蜂鸣器=整点报时器
- java青蛙_跳青蛙的求解Java实现
- 访问虚拟机Linux服务打不开页面
- 惊闻广州政协做调查为广州电视台取消粤语节目做准备
- 比乌镇人少!西塘安静!杭州这3个古镇 1h 直达!
- iOS MJRefresh 自定义刷新动画
热门文章
- Flask框架(SQLAlchemy(python3版本)中添加数据 )
- 二进制蚁群算法【源码实现】
- JavaScript实现graphBridges图桥算法(附完整源码)
- OpenCASCADE:建模算法之将触感的形状连接起来
- boost::test模块带有自定义初始化测试的静态库使用变体
- boost::multiprecision模块cpp_complex相关的测试程序
- boost::hana::contains用法的测试程序
- boost::hana::slice用法的测试程序
- GDCM:制作模板的测试程序
- ITK:Levenberg-Marquardt优化