QT实验九网络实验二UDP通信Word文件下载.docx
- 文档编号:20698664
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:12
- 大小:241.78KB
QT实验九网络实验二UDP通信Word文件下载.docx
《QT实验九网络实验二UDP通信Word文件下载.docx》由会员分享,可在线阅读,更多相关《QT实验九网络实验二UDP通信Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
gbk"
));
setCodecForCStrings(QTextCodec:
Widgetw;
w.show();
returna.exec();
}
2)widget.cpp修改如下:
ui_widget.h"
qdatetime.h>
Widget:
Widget(QWidget*parent):
QWidget(parent),
ui(newUi:
Widget)
ui->
setupUi(this);
configFlag=false;
//初始化连接参数为未连接
getTextEdit->
ensureCursorVisible();
sendTextEdit->
setFocus();
//程序启动时,焦点停在发送对话框
ipEdit->
setText("
192.168.2.77"
);
//设置默认的远程端Ip
portEdit->
6667"
//设置默认远程端口号
//关联快捷键
udpSendButton->
setShortcut(tr("
Alt+F"
localIpStr=getIp();
localHostAddr=newQHostAddress(localIpStr);
udpSocket1=newQUdpSocket(this);
boolbindFlag=udpSocket1->
bind(*localHostAddr,6665,QUdpSocket:
ShareAddress);
//6665为本地端口
if(!
bindFlag)
{
QMessageBoxbox;
box.setText(tr("
初始化绑定socket错误!
"
box.exec();
}
else
connect(udpSocket1,SIGNAL(readyRead()),this,SLOT(receive()));
connect(ui->
udpSendButton,SIGNAL(clicked()),this,SLOT(send()));
this->
setWindowTitle(tr("
基于Qt的UDP通信程序"
voidWidget:
send()
autoScroll();
QStringsendStr=ui->
toPlainText();
QByteArraysendByteArray=sendStr.toAscii();
if(sendStr.length()==0)
请输入发送内容"
elseif(configFlag)
udpSocket1->
writeDatagram(sendByteArray,sendByteArray.length(),*remoteHostAddr,6667);
//上面使用远程端口
//本地发送信息再信息交互窗口的显示
QDateTimetime;
QStringtimeStr=time.currentDateTime().toString("
yyyy-MM-ddhh:
mm:
ssddd"
setTextColor(QColor("
red"
insertPlainText("
本机"
+localIpStr+"
"
+timeStr+"
\n"
black"
insertPlainText(sendStr+"
clear();
//点击发送后,发送编辑框内清零
//焦点停留在发送编辑框
elseif(!
configFlag)
box.setText("
请您先点击确认按钮!
receive()
while(udpSocket1->
hasPendingDatagrams())
QTextCodec*tc=QTextCodec:
//gbk
QByteArraydata;
data.resize(udpSocket1->
pendingDatagramSize());
readDatagram(data.data(),data.size());
QStringdataStr=tc->
toUnicode(data);
远程"
+remoteIpStr+"
+timeStr+"
);
insertPlainText(dataStr+"
QStringWidget:
getIp()
QList<
QHostAddress>
list=QNetworkInterface:
allAddresses();
foreach(QHostAddressaddress,list)
if(address.protocol()==QAbstractSocket:
IPv4Protocol)//我们使用IPv4地址
if(address.toString().contains("
127.0."
))
continue;
qDebug()<
<
本机Ip:
address.toString();
returnaddress.toString();
return0;
autoScroll()
QTextCursorcursor=ui->
textCursor();
cursor.movePosition(QTextCursor:
End);
setTextCursor(cursor);
~Widget()
deleteui;
on_clearButton_clicked()
on_configButton_clicked()
remoteIpStr=ui->
text();
QStringport=ui->
远程端Ip:
remoteIpStr<
端口号:
port;
remoteHostAddr=newQHostAddress(remoteIpStr);
if(remoteIpStr.length()==0||port.length()==0||port.toInt()<
1024)
请正确设置远程端Ip地址和端口号!
configFlag=true;
您设置的远程端Ip:
+port);
on_exitButton_clicked()
close();
3)widget.h修改如下:
#ifndefWIDGET_H
#defineWIDGET_H
QWidget>
QtNetwork/QUdpSocket>
QtNetwork/QHostAddress>
QMessageBox>
QHostInfo>
QNetworkInterface>
namespaceUi{
classWidget;
classWidget:
publicQWidget
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);
~Widget();
QHostAddress*localHostAddr;
QHostAddress*remoteHostAddr;
QStringlocalIpStr;
QStringremoteIpStr;
QStringgetIp();
voidautoScroll();
privateslots:
voidsend();
voidreceive();
voidon_clearButton_clicked();
voidon_configButton_clicked();
voidon_exitButton_clicked();
private:
Ui:
Widget*ui;
QUdpSocket*udpSocket1;
boolconfigFlag;
};
#endif//WIDGET_H
4)建立widget.ui如上图所示。
上面的为某台机器的发送和接受程序。
那么另一台和它通信的机器发送和接受程序该如何修改,才能完成互相通信呢?
实验效果如下:
QT网络编程---获取基本网络信息
主要涉及网络模块(QtNetworkModule)的QHostInfo,QHostAddress,QNetworkInterface和QNetworkAddressEntry等几个类。
新建Qt4GuiApplication工程,工程名为myIP,Baseclass选择QWidget。
工程文件中加入:
QT+=network。
在widget.h文件中包含头文件:
QtNetwork>
1.使用QHostInfo获取主机名和IP地址
(1)获取主机名
在widget.cpp文件中的构造函数中添加代码:
QStringlocalHostName=QHostInfo:
localHostName();
qDebug()<
”localHostName:
“<
localHostName;
这里使用了QHostInfo类的localHostName类来获取本机的计算机名称。
运行程序,在下面的输出栏里的信息如下:
可以看到,获取了计算机名。
(2)获取本机的IP地址
继续在构造函数中添加代码:
QHostInfoinfo=QHostInfo:
fromName(localHostName);
”IPAddress:
info.addresses();
应用QHostInfo类的fromName()函数,使用上面获得的主机名为参数,来获取本机的信息。
然后再利用QHostInfo类的addresses()函数,获取本机的所有IP地址信息。
运行程序,输出信息如下:
在这里只有一条IP地址。
但是,在其他系统上,可能出现多条IP地址,其中可能包含了IPv4和IPv6的地址,一般使用IPv4的地址,所以可只输出IPv4的地址。
继续添加代码:
foreach(QHostAddressaddress,info.addresses())
IPv4Protocol)
qDebug()<
address.toString();
因为IP地址由QHostAddress类来管理,所以可以使用该类来获取一条IP地址,然后使用该类的protocol()函数来判断其是否为IPv4地址。
如果是IPv6地址,可以使用QAbstractSocket:
IPv6Protocol来判断。
最后将IP地址以QString类型输出。
运行效果如下:
(3)以主机名获取IP地址
在上面用本机的计算机名获取本机的IP地址。
其实QHostInfo类也可以用来获取任意主机名的IP地址,如一个网站的IP地址。
在这里使用lookupHost()函数。
它是基于信号和槽的,一旦查找到了IP地址,就会触发槽函数。
具体用法如下。
在widget.h文件中添加一个私有槽函数:
voidlookedUp(constQHostInfo&
host);
然后在widget.cpp中的构造函数中先将上面添加的代码全部删除,然后添加以下代码:
QHostInfo:
lookupHost(“”,this,SLOT(lookedUp(QHostInfo)));
这里查询XX网站的IP地址,如果查找到,就会执行lookedUp()函数。
在widget.cpp中添加lookedUp()函数的实现代码:
lookedUp(constQHostInfo&
host)
host.addresses().first().toString();
输出信息如下:
2.通过QNetworkInterface类来获取本机的IP地址和网络接口信息
QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。
在每一个网络接口信息中都包含了0个或多个IP地址,而每一个IP地址又包含了和它相关的子网掩码和广播地址,它们三者被封装在一个QNetworkAddressEntry对象中。
网络接口信息中也提供了硬件地址信息。
将widge.cpp构造函数中以前添加的代码删除,然后添加以下代码。
QList<
allInterfaces();
//获取所有网络接口的列表
foreach(QNetworkInterfaceinterface,list)
{
//遍历每一个网络接口
“Device:
interface.name();
//设备名
“HardwareAddress:
interface.hardwareAddress();
//硬件地址
QNetworkAddressEntry>
entryList=interface.addressEntries();
//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
foreach(QNetworkAddressEntryentry,entryList)
{//遍历每一个IP地址条目
entry.ip().toString();
//IP地址
”Netmask:
mask().toString();
//子网掩码
”Broadcast:
entry.broadcast().toString();
//广播地址
运行程序,输出如下:
其实,如果只想利用QNetworkInterface类来获取IP地址,那么就没必要像上面那样复杂,这个类提供了一个便捷的函数allAddresses()来获取IP地址,例如:
QStringaddress=QNetworkInterface:
allAddresses().first().toString();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QT 实验 网络 UDP 通信