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相关推荐

  1. Qt中的网络编程(TCP)

    在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类: 可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12  常见的有: QTcpServer ...

  2. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  3. Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)

    Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...

  4. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  5. 学习Java第十九天(一):1、Java中的网络编程

    1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...

  6. 网络游戏中的网络编程

    谈谈网络游戏中的"网络"编程 ????近段时间总是有不少人问我关于完成端口模型的一些资料,很多时候其实我很郁闷,为什么大家会选择使用完成端口呢?或者说很多时候他们竟为了使用完成端口 ...

  7. Java中的网络编程类(TCPUDP)

    Java中的网络编程类 n Java.net包 – TCP协议 URL URLConnection Socket ServerSocket – UDP协议 DatagramPacket Datagra ...

  8. Android中的网络编程-黄俊东-专题视频课程

    Android中的网络编程-1902人已学习 课程介绍         剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益     每一个学员都能系统地掌握Android中的网 ...

  9. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

最新文章

  1. raft论文 中文 pdf_八篇论文总结BERT+KG:预训练模型与知识图谱相结合的研究进展...
  2. 【数字信号处理】分贝的概念及其日常使用中常见的错误
  3. 外接显示器设置_如何为一台电脑设置两个显示器
  4. 最长递增字串的三种做法
  5. Oracle11g报bde,表现 – BDE与ADO在德尔福
  6. CentOS配置DHCP服务器
  7. [转载]网站分析的最基本度量(3)——网站分析工具如何辨别UV
  8. Google Python 编程风格指南
  9. SQL优化常用方法51
  10. floodlight路由机制分析
  11. 埃文科技教你如何验证IP地址定位的准确率
  12. 制作bt种子(非pt站私有种)
  13. Notepad软件的下载安装和使用
  14. matlab中tdma源程序,40MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法MATLAB源代码...
  15. 树莓派蜂鸣器python代码_树莓派+蜂鸣器=整点报时器
  16. java青蛙_跳青蛙的求解Java实现
  17. 访问虚拟机Linux服务打不开页面
  18. 惊闻广州政协做调查为广州电视台取消粤语节目做准备
  19. 比乌镇人少!西塘安静!杭州这3个古镇 1h 直达!
  20. iOS MJRefresh 自定义刷新动画

热门文章

  1. Flask框架(SQLAlchemy(python3版本)中添加数据 )
  2. 二进制蚁群算法【源码实现】
  3. JavaScript实现graphBridges图桥算法(附完整源码)
  4. OpenCASCADE:建模算法之将触感的形状连接起来
  5. boost::test模块带有自定义初始化测试的静态库使用变体
  6. boost::multiprecision模块cpp_complex相关的测试程序
  7. boost::hana::contains用法的测试程序
  8. boost::hana::slice用法的测试程序
  9. GDCM:制作模板的测试程序
  10. ITK:Levenberg-Marquardt优化