5.关于QT中的网络编程,QTcpSocket,QUdpSocket
来源:互联网 发布:天涯明月刀mac版 编辑:程序博客网 时间:2024/06/05 18:17
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
#ifndefCHOOSEINTERFACE_H
#defineCHOOSEINTERFACE_H
#include<QDialog>
#include<QComboBox>
classChooseInterface:publicQDialog
{
Q_OBJECT
public:
explicitChooseInterface(QWidget*parent= 0);
QComboBox*_comboBox;
QString_strSelect;
signals:
publicslots:
voidslotComboBoxChange(QString);
};
#endif//CHOOSEINTERFACE_H
编写ChooseInterface.cpp
#include"ChooseInterface.h"
#include<QNetworkInterface>
#include<QVBoxLayout>
ChooseInterface::ChooseInterface(QWidget*parent):
QDialog(parent)
{
/*getallinterface*/
QList<QHostAddress>addrList=QNetworkInterface::allAddresses();
#if0
QList<QNetworkInterface>infList =QNetworkInterface::allInterfaces();
QList<QNetworkAddressEntry>entryList =infList.at(0).addressEntries();
entryList.at(0).broadcast()
#endif
//编写一个下拉选
_comboBox=newQComboBox;
QVBoxLayout*lay=newQVBoxLayout(this);
lay->addWidget(_comboBox);
foreach(QHostAddressaddr,addrList)
{
//将地址都转换成为ipv4的地址
quint32ipaddr=addr.toIPv4Address();
//去掉0的ip
if(ipaddr==0)
continue;
//在comboBox中添加下拉选
_comboBox->addItem(QHostAddress(ipaddr).toString());
}
//当下拉选发生变化时的操作
connect(_comboBox,SIGNAL(currentIndexChanged(QString)),
this,SLOT(slotComboBoxChange(QString)));
}
voidChooseInterface::slotComboBoxChange(QStringstr)
{
this->_strSelect=str;
}
上面的运行结果是:
编写TcpServer.h
#ifndefTCPSERVER_H
#defineTCPSERVER_H
#include<QWidget>
#include<QTcpServer>
#include<QTcpSocket>
#include<QTextBrowser>
classTcpServer:publicQWidget
{
Q_OBJECT
public:
explicitTcpServer(QWidget*parent= 0);
QTcpServer*_server;
QTcpSocket*_socket;
QTextBrowser*_show;
signals:
publicslots:
voidslotNetConnection();
voidslotReadyRead();
};
#endif//TCPSERVER_H
编写TcpServer.cpp
#include"TcpServer.h"
#include<QHBoxLayout>
#include<QNetworkInterface>
#include<QMessageBox>
#include"ChooseInterface.h"
TcpServer::TcpServer(QWidget*parent):
QWidget(parent)
{
//创建服务器并监听
_server=newQTcpServer;
ChooseInterfacedlg;
dlg.exec();
//消息提示框
QMessageBox::information(NULL,"youselecttheip:",dlg._strSelect);
_server->listen(QHostAddress(dlg._strSelect),9988);
//当有客户端来连接时,调用slotNetConnection方法
connect(_server,SIGNAL(newConnection()),
this,SLOT(slotNetConnection()));
_show=newQTextBrowser;
QHBoxLayout*lay=newQHBoxLayout(this);
lay->addWidget(_show);
}
voidTcpServer::slotNetConnection()
{
//判断是否有未处理的连接
while(_server->hasPendingConnections())
{
//调用nextPeddingConnection去获得连接的socket
_socket=_server->nextPendingConnection();
_show->append("Newconnection....");
//为新的socket提供槽函数,来接收数据
connect(_socket,SIGNAL(readyRead()),
this,SLOT(slotReadyRead()));
}
}
voidTcpServer::slotReadyRead()
{
//接收数据,判断是否有数据,如果有,通过readAll函数获取所有数据
while(_socket->bytesAvailable()>0)
{
_show->append("Dataarrived.....");
QByteArraybuf=_socket->readAll();
_show->append(buf);
}
}
编写TcpClient.h
#ifndefTCPCLIENT_H
#defineTCPCLIENT_H
#include<QWidget>
#include<QTcpSocket>
#include<QLineEdit>
classTcpClient:publicQWidget
{
Q_OBJECT
public:
explicitTcpClient(QWidget*parent= 0);
QTcpSocket*_socket;
QLineEdit*_lineEdit;
signals:
publicslots:
voidslotButtonClick();
};
#endif//TCPCLIENT_H
编写TcpClient.cpp
#include"TcpClient.h"
#include<QHBoxLayout>
#include<QPushButton>
TcpClient::TcpClient(QWidget*parent):
QWidget(parent)
{
_socket=newQTcpSocket(this);
_socket->connectToHost("127.0.0.1",9988);
_lineEdit=newQLineEdit;
QHBoxLayout*lay=newQHBoxLayout(this);
lay->addWidget(_lineEdit);
QPushButton*button=newQPushButton("Send");
lay->addWidget(button);
connect(button,SIGNAL(clicked()),this,SLOT(slotButtonClick()));
connect(_lineEdit,SIGNAL(returnPressed()),this,SLOT(slotButtonClick()));
}
voidTcpClient::slotButtonClick()
{
QStringstrText=_lineEdit->text();
if(strText.isEmpty())
return;
_socket->write(strText.toUtf8());
_lineEdit->clear();
}
MyWidget.h
#ifndefMYWIDGET_H
#defineMYWIDGET_H
#include<QWidget>
classMyWidget:publicQWidget
{
Q_OBJECT
public:
explicitMyWidget(QWidget*parent= 0);
signals:
publicslots:
};
#endif//MYWIDGET_H
MyWidget.cpp
#include"MyWidget.h"
#include<QApplication>
#include"TcpServer.h"
#include"TcpClient.h"
MyWidget::MyWidget(QWidget*parent):
QWidget(parent)
{
}
intmain(intargc,char**argv)
{
QApplicationapp(argc,argv);
TcpServers;s.show();
TcpClientc;c.show();
s.setWindowTitle("server");
c.setWindowTitle("client");
returnapp.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
#ifndefUDP1_H
#defineUDP1_H
#include<QWidget>
#include<QUdpSocket>
classUdp1:publicQWidget
{
Q_OBJECT
public:
explicitUdp1(QWidget*parent= 0);
QUdpSocket*_udp;
signals:
publicslots:
voidslotReadyRead();
};
#endif//UDP1_H
Udp1.cpp
#include"udp1.h"
#include<QTimer>
#include<QDateTime>
Udp1::Udp1(QWidget*parent):
QWidget(parent)
{
//创建udpsocket,并连接槽函数,用来接收数据
_udp=newQUdpSocket;
_udp->bind(10001);
connect(_udp,SIGNAL(readyRead()),
this,SLOT(slotReadyRead()));
//使用定时器来定时发送时间戳
QTimer*timer=newQTimer;
timer->setInterval(1000);
timer->start();
connect(timer,&QTimer::timeout,[&](){
quint64timestamp=QDateTime::currentMSecsSinceEpoch();
QStringstr=QString::number(timestamp);
#if0
//普通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.255ismulticastaddressofLAN
_udp->writeDatagram(str.toUtf8(),QHostAddress("224.0.0.131"),10002);
#endif
});
}
voidUdp1::slotReadyRead()
{
while(_udp->hasPendingDatagrams())
{
quint32datagramSize=_udp->pendingDatagramSize();
QByteArraybuf(datagramSize,0);
_udp->readDatagram(buf.data(),buf.size());
qDebug()<<"Udp1"<<buf;
}
}
Udp2.h
#ifndefUDP2_H
#defineUDP2_H
#include<QWidget>
#include<QUdpSocket>
classUdp2:publicQWidget
{
Q_OBJECT
public:
explicitUdp2(QWidget*parent= 0);
QUdpSocket*_udp;
signals:
publicslots:
voidslotReadyRead();
};
#endif//UDP2_H
Udp2.cpp
#include"udp2.h"
#include<QTimer>
#include<QDateTime>
#include<QLineEdit>
Udp2::Udp2(QWidget*parent):
QWidget(parent)
{
_udp=newQUdpSocket;
//theaddressofbindandmulticastmustbesametpye(IPV4orIPV6)
_udp->bind(QHostAddress::AnyIPv4,10002);
//jointhemulticastaddress(224.0.0.131)forrecvmulicastpackage
_udp->joinMulticastGroup(QHostAddress("224.0.0.131"));
connect(_udp,SIGNAL(readyRead()),
this,SLOT(slotReadyRead()));
QTimer*timer=newQTimer(this);
timer->setInterval(1000);
timer->start();
connect(timer,&QTimer::timeout,[&](){
quint64timestamp=QDateTime::currentMSecsSinceEpoch();
QStringstr=QString::number(timestamp);
_udp->writeDatagram(str.toUtf8(),QHostAddress("127.0.0.1"),10001);
});
}
voidUdp2::slotReadyRead()
{
while(_udp->hasPendingDatagrams())
{
quint32datagramSize=_udp->pendingDatagramSize();
QByteArraybuf(datagramSize,0);
_udp->readDatagram(buf.data(),buf.size());
qDebug()<<"Udp2"<<buf;
}
}
运行结果:
控制台输出结果如下:
- 5.关于QT中的网络编程,QTcpSocket,QUdpSocket
- 简单的通信(QUdpSocket、 QTcpSocket、QWebSocket)-----Qt网络
- Qt网络编程QTcpServer和QTcpSocket的理解
- Qt网络编程QTcpServer和QTcpSocket的理解
- QUdpSocket和QTcpSocket的使用
- Qt之QUdpSocket定时器网络广播
- qt4中的网络通信network, QTCPServer --- QTCPSocket
- QtCreator 网络编程——Udp模型(QUdpSocket)
- QtCreator 网络编程——Udp模型(QUdpSocket)
- QTcpSocket 编程
- Qt(3)QUdpsocket
- QT QUdpSocket广播
- QT QUdpSocket类
- QUdpSocket进行网络传输
- QTcpServer、QTcpSocket、QUdpSocket在聊天程序上的应用
- [QT]QT教程之实例分析[九] 网络广播程序(QUdpSocket)
- 关于网络编程中的序
- 关于网络编程中的backlog
- CSS类,ID,标签和伪类详细说明
- 第16周【项目 3-用函数指针调用函数】
- 矩阵的坐标变换(转)
- 第十六周项目1-数组的排序
- zookeeper--分布式集群管理
- 5.关于QT中的网络编程,QTcpSocket,QUdpSocket
- LeetCode OJ 之 Flatten Binary Tree to Linked List (把二叉树转换成链表)
- 第十六周 OJ 指针引出奇书因子
- Bluetooth
- 16周统计句子中的单词个数
- 自定义
- 第十六周项目2-用指针玩字符串(一)
- OpenGL 学习笔记(3)绘制几何物体
- CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法 .