课程设计 实验报告
模 块 名 称 TCPIP网络通信程序设计
专 业
学 生 班 级
学 生 学 号
学 生 姓 名
指 导 教 师
XX学软件设计TCPIP网络通信程序设计实验报告
目 录
题目1获取计算机名称IP址 1
1设计容 1
2设计分析述程序实现流程框图 1
3关键实现代码注解 2
4程序运行测试结果 4
5程序设计中遇问题改进思路 4
题目2基CS模式通信实验 5
1设计容 5
2设计分析述程序实现流程框图 5
3关键实现代码注解 8
4程序运行测试结果 21
5程序设计中遇问题改进思路 23
题目3简单浏览器实现 24
1设计容 24
2设计分析述程序实现流程框图 24
3关键实现代码注解 25
4程序运行测试结果 26
5程序设计中遇问题改进思路 28
题目4利smtp协议发送邮件 29
1设计容 29
2设计分析述程序实现流程框图 29
3关键实现代码注解 30
4程序运行测试结果 37
5程序设计中遇问题改进思路 38
课程设计节 39
附录 40
题目1获取计算机名称IP址
1设计容
获取计算机名称IP址实验
编写程序实现述功:
获取计算机名称IP址
2设计分析述程序实现流程框图
Qt CreatorQt开发轻量级跨台集成开发环境Qt Creator带两关键益处:提供首专支持跨台开发设计集成开发环境 (IDE)确保首次接触Qt框架开发员迅速手操作开发Qt应程序Qt Creator简单易功强IDE
Qt数库中提供QtNetwork Module中QHostInfoQHostAddressQNetworkInterfaceQNetAddressEntry等类查询网络参数QNetworkInterface类提供程序运行机IP址网络接口信息列表网络接口信息中包含IP址IP址包含相关子网掩码广播址三者封装象中QNetworkAddressEntry网络接口信息包含硬件址信息[1]
完成界面
getHostInformation()函数
获机信息
slotDetail()函数
网络接口信息
运行出结果
3关键实现代码注解
1 NetworkInformationpro文件中添加
QT + network
2 头文件networkinformationh中添加代码:
#include
#include
public
void getHostInformation()
public slots
void slotDetail()
QHostInfoQNetworkInterface进行声明添加槽函数
3 源文件networkinformationcpp中添加代码中构造函数添加:
getHostInformation() 获机信息
connect(detailBtnSIGNAL(clicked())thisSLOT(slotDetail()))
4 getHostInformation()函数获机信息具体实现代码:
void NetworkInformationgetHostInformation()
{
QString localHostName QHostInfolocalHostName()获机机名
LineEditLocalHostName>setText(localHostName)
QHostInfo hostInfo QHostInfofromName(localHostName)根机名获相关机信息包括IP址等QHostInfofromName()函数通机名查找IP址信息
QList
if(listAddressisEmpty())获机IP址列表空空情况第IP址
{
LineEditAddress>setText(listAddressfirst()toString())
}
}
注释见[2]
5 slotDetail()函数获网络接口相关信息具体实现代码:
void NetworkInformationslotDetail()获网络接口相关信息
{
QString detail
QList
for(int i0i
QNetworkInterface interfacelistat(i)
detaildetail+u8设备:+interfacename()+\n获网络接口名称
detaildetail+u8硬件址:+interfacehardwareAddress()+\n获网络接口硬件址
QList
网络接口包括0IP址IP址选择性子网掩码()广播址相关联
QNetworkAddressEntry类存储网络接口支持IP址时包括相关子网掩码广播址
for(int j0j
QNetworkAddressEntry entryentryListat(j)
detaildetail+\t+u8IP 址:+entryip()toString()+\n
detaildetail+\t+u8子网掩码:+entrynetmask()toString()+\n
detaildetail+\t+u8广播址:+entrybroadcast()toString()+\n
}
}
QMessageBoxinformation(thistr(Detail)detail)
}
4程序运行测试结果
图11 获取机网络信息 图12 获取机详细网络信息
5程序设计中遇问题改进思路
1 详细钮单击时没明显痕迹期添加特效PushButton属性checkable设置真运行时鼠标单击钮颜色会变淡单击会变亮颜色深浅提醒toggle菜单栏中选项般trigger发射信号
2.报错出现cannot find file mainpro 原QT工程目录树中出现汉字空格等
题目2基CS模式通信实验
1设计容
基CS模式通信实验
编写程序实现基UDP 模式通信程序基TCP 模式通信程序
基求:输入计算机IP址端口号输入发送文信息显示接受文信息
2设计分析述程序实现流程框图
基UDP模式
UDP方式面数报连接协议客户端服务器建立连接负责调发送函数服务器发出数报样服务器客户端接收连接负责调接收函数等某客户端数达
Qt中通QupSocket类实现UDP协议编程Socket简单说IP 址加port端口传输数知道机子传送IP 址确定台机台机子运行着种样网络程序时端口指定UDP 程序说Socket 指明数报传输路径
编写两程序发送数报做客户端接收数报做服务器端均应UDP 协议样构成谓CS(客户端服务器)编程模型
首先做服务器端
先头文件udpclienth中声明需种控件完成应源代码先形成服务器界面然头文件udpclienth中添加需槽函数源文件udpservercpp中添加声明设置端口参数(程序设置5555)创建QUdpSocket程序够定发送广播址
接做客户端
样先头文件udpclienth中声明需种控件完成应源代码形成客户端界面然构造函数中设置相应端口号参数(5555)定义CloseBtnClicked()dataReceived()函数实现客户端功
图21 UDP协议工作原理
图22 UDP客户端服务器间交互方式
二基TCP模式
1
图23 TCP协议工作原理
2
图24 TCP客户端服务器间交互时序
3
图25 TCP文件传输结构
3关键实现代码注解
基UDP模式
服务器端:
1UdpServerpro中添加:
QT + network
2头文件udpserverh中添加需槽函数:
#include
#include
public slots
void StartBtnClicked()
void timeout()
private
QLabel *TimerLabel
QLineEdit *TextLineEdit
QPushButton *StartBtn
QVBoxLayout *mainLayout
int port
bool isStarted
QUdpSocket *udpSocket
QTimer *timer
3udpservercpp槽函数中添加代码:
connect(StartBtnSIGNAL(clicked())thisSLOT(StartBtnClicked()))
port 6665设置UDP端口号参数服务器定时端口发送广播消息
isStartedfalse
udpSocket new QUdpSocket(this)
timer new QTimer(this)创建QUdpSocket
connect(timerSIGNAL(timeout())thisSLOT(timeout()))定时发送广播信息
4 StartBtnClicked()函数具体代码:
void UdpServerStartBtnClicked()开始钮函数设定
{
if(isStarted)
{
StartBtn>setText(u8停止)
timer>start(1000)
isStarted true
}
else
{
StartBtn>setText(u8开始)
isStarted false
timer>stop()
}
}
5timeout()函数完成端口发送广播消息功:
void UdpServertimeout()完成端口发送广播信息功
{
QString msg TextLineEdit>text()
int length0
if(msg)
{
return
}
if((lengthudpSocket>writeDatagram(msgtoLatin1()msglength()QHostAddressBroadcastport))msglength())
{
return
}
QHostAddressBroadcast指定广播址发送
}
客户端:
1UdpClientpro中加入代码:
QT + network
2udpclientcpp构造函数中添加代码:
connect(CloseBtnSIGNAL(clicked())thisSLOT(CloseBtnClicked()))
port 6665设置UDP端口号参数指定端口监听数
udpSocket new QUdpSocket(this)创建QUdpSocket
connect(udpSocketSIGNAL(readyRead())thisSLOT(dataReceived()))
连接QIODevicereadyRead()信号QUdpSocketIO设备QIODevice继承数达IO设备时发出readyRead()信号
bool resultudpSocket>bind(port)绑定指定端口
if(result)
{
QMessageBoxinformation(thistr(error)tr(udp socket create error))
return
}
3定义CloseBtnClicked()函数:
void UdpClientCloseBtnClicked()
{
close()
}
4定义dataReceived()函数:
void UdpClientdataReceived()响应QUdpSocketreadyRead()信号旦UdpSocket象中数读时通readyDatagram()方法数读出显示
{
while(udpSocket>hasPendingDatagrams())判断UdpSocket中否数报读hasPendingDatagrams()方法少数报读时返回true否返回false
{
QByteArray datagramLine4750实现读取第数报pendingDatagramSize()获第数报长度
datagramresize(udpSocket>pendingDatagramSize())
udpSocket>readDatagram(datagramdata()datagramsize())
QString msgdatagramdata()
ReceiveTextEdit>insertPlainText(msg)显示数容
}
}
二基TCP模式
服务器端:
1头文件tcpserverh中声明需种控件TcpServer继承Qdialog实现服务器端话框显示控制具体代码[2]:
#include
#include
#include
#include
#include
#include
#include serverh
class TcpServer public QDialog
{
Q_OBJECT
public
TcpServer(QWidget *parent 0QtWindowFlags f0)
~TcpServer()
private
QListWidget *ContentListWidget
QLabel *PortLabel
QLineEdit *PortLineEdit
QPushButton *CreateBtn
QGridLayout *mainLayout
int port
Server *server
}
2源文件tcpservercpp中TcpServer类构造函数实现窗体控件创建布局等具体代码:
#include tcpserverh
TcpServerTcpServer(QWidget *parentQtWindowFlags f)
QDialog(parentf)
{
setWindowTitle(tr(TCP Server))
ContentListWidget new QListWidget
PortLabel new QLabel(u8端口:)
PortLineEdit new QLineEdit
CreateBtn new QPushButton(u8创建聊天室)
mainLayout new QGridLayout(this)
mainLayout>addWidget(ContentListWidget0012)
mainLayout>addWidget(PortLabel10)
mainLayout>addWidget(PortLineEdit11)
mainLayout>addWidget(CreateBtn2012)
port5555
PortLineEdit>setText(QStringnumber(port))
connect(CreateBtnSIGNAL(clicked())thisSLOT(slotCreateServer()))
}
3 工程TcpServerpro中添加语句:
QT + network
4 工程TcpServerpro中添加C++类文件tcpclientsockethtcpclientsocketcppTcpClientSocket继承QTcpSocket创建TCP套接字便服务器端实现客户端程序通信
源文件tcpclientsocketcpp中构造函数(TcpClientSocket)容(指定信号槽连接关系):
#include tcpclientsocketh
TcpClientSocketTcpClientSocket(QObject *parent)指定信号槽连接关系
{
connect(thisSIGNAL(readyRead())thisSLOT(dataReceived()))
connect(thisSIGNAL(disconnected())thisSLOT(slotDisconnected()))disconnected()信号断开连接时发出
}
5 源文件tcpclientsocketcpp中dataReceived()函数具体代码:
void TcpClientSocketdataReceived()数时触发dataReceived()函数套接字中效数取出然发出updateClients()信号
{
while(bytesAvailable()>0)
{
int length bytesAvailable()
char buf[1024]
read(buflength)
QString msgbuf
emit updateClients(msglength)updateClients()信号通知服务器聊天室成员广播信息
}
}
6工程TcpServerpro中添加C++类文件serverhservercppServer继承QTcpServer实现TCP协议服务器利QTcpServer开发着监听指定端口TCP连接具体代码:
#include
#include
#include tcpclientsocketh包含TCP套接字
class Server public QTcpServer
{
Q_OBJECT 添加宏(Q_OBJECT)实现信号槽通信
public
Server(QObject *parent0int port0)
QList
signals
void updateServer(QStringint)
public slots
void updateClients(QStringint)
void slotDisconnected(int)
protected
void incomingConnection(int socketDescriptor)
}
7源文件servercpp中构造函数(Server)具体容:
#include serverh
ServerServer(QObject *parentint port)
QTcpServer(parent)
{
listen(QHostAddressAnyport)指定端口意址进行监听
}
8 源文件servercpp中出现新连接时QTcpServer会立触发incomingConnection()函数参数socketDescriptor指定连接Socket描述符具体代码:
void ServerincomingConnection(int socketDescriptor)出现新连接时QTcpServer触发incomingConnection()函数
{
TcpClientSocket *tcpClientSocketnew TcpClientSocket(this)创建新TcpClientSocket客户端通信 connect(tcpClientSocketSIGNAL(updateClients(QStringint))thisSLOT(updateClients(QStringint)))连接TcpClientSocketupdateClients信号 connect(tcpClientSocketSIGNAL(disconnected(int))thisSLOT(slotDisconnected(int)))连接TcpClientSocketdisconnected信号
tcpClientSocket>setSocketDescriptor(socketDescriptor)新创建TcpClientSocket套接字描述符指定参数socketDescriptor
tcpClientSocketListappend(tcpClientSocket)tcpClientSocketList加入客户端套接字列表便理
}
9 源文件servercpp中updateClients()函数意客户端发信息进行广播保证聊天室客户均发言具体代码:
void ServerupdateClients(QString msgint length)意客户端发信息进行广播保证聊天室客户均发言
{
emit updateServer(msglength)
for(int i0i
QTcpSocket *item tcpClientSocketListat(i)
if(item>write(msgtoLatin1()length)length)
{
continue
}
}
}
10 源文件tcpservercpp中槽函数slotCreateServer()创建TCP服务器具体容:
void TcpServerslotCreateServer()创建TCP服务器
{
server new Server(thisport)创建Server象
connect(serverSIGNAL(updateServer(QStringint))thisSLOT(updateServer(QStringint)))Server象updateServer()信号相应槽函数进行连接
CreateBtn>setEnabled(false)
}
客户端:
1源文件tcpclientcpp具体代码:
#include tcpclienth
#include
#include
TcpClientTcpClient(QWidget *parentQtWindowFlags f)
QDialog(parentf)
{
setWindowTitle(tr(TCP Client))
contentListWidget new QListWidget
sendLineEdit new QLineEdit
sendBtn new QPushButton(u8发送)
userNameLabel new QLabel(u8户名:)
userNameLineEdit new QLineEdit
serverIPLabel new QLabel(u8服务器址:)
serverIPLineEdit new QLineEdit
portLabel new QLabel(u8端口:)
portLineEdit new QLineEdit
enterBtn new QPushButton(u8进入聊天室)
mainLayout new QGridLayout(this)
mainLayout>addWidget(contentListWidget0012)
mainLayout>addWidget(sendLineEdit10)
mainLayout>addWidget(sendBtn11)
mainLayout>addWidget(userNameLabel20)
mainLayout>addWidget(userNameLineEdit21)
mainLayout>addWidget(serverIPLabel30)
mainLayout>addWidget(serverIPLineEdit31)
mainLayout>addWidget(portLabel40)
mainLayout>addWidget(portLineEdit41)
mainLayout>addWidget(enterBtn5012)
}
2客户端工程文件TcpClientpro中添加语句:
QT + network
3源文件tcpclientcpp构造函数中添加代码:
status false
port 5555 意设置端口号
portLineEdit>setText(QStringnumber(port))
serverIP new QHostAddress()
connect(enterBtnSIGNAL(clicked())thisSLOT(slotEnter()))
connect(sendBtnSIGNAL(clicked())thisSLOT(slotSend()))
sendBtn>setEnabled(false)
代码中槽函数slotEnter()实现进入离开聊天室功具体代码:
void TcpClientslotEnter()实现进入离开聊天室功
{
if(status)
{
QString ip serverIPLineEdit>text()
if(serverIP>setAddress(ip))
{
QMessageBoxinformation(thistr(error)tr(server ip address error))
return
}
if(userNameLineEdit>text())
{
QMessageBoxinformation(thistr(error)tr(User name error))
return
}
userNameuserNameLineEdit>text()
tcpSocket new QTcpSocket(this)
connect(tcpSocketSIGNAL(connected())thisSLOT(slotConnected()))
connect(tcpSocketSIGNAL(disconnected())thisSLOT(slotDisconnected()))
connect(tcpSocketSIGNAL(readyRead())thisSLOT(dataReceived()))
tcpSocket>connectToHost(*serverIPport)
statustrue
}
else
{
int length0
QString msguserName+tr(Leave Chat Room)
if((lengthtcpSocket>write(msgtoLatin1()msglength()))msg length())
{
return
}
tcpSocket>disconnectFromHost()
statusfalse
}
}
4 槽函数slotConnected():
void TcpClientslotConnected()槽函数slotConnected()connected()信号响应槽服务器连接成功客户端构造条进入聊天室消息通知服务器
{
sendBtn>setEnabled(true)
enterBtn>setText(u8离开)
int length0
QString msguserName+tr(Enter Chat Room)
if((lengthtcpSocket>write(msgtoLatin1()msglength()))msglength())
{
return
}
}
5源文件tcpclientcpp中dataReceived()函数:
void TcpClientdataReceived()数时触发函数套接字中效数取出显示
{
while(tcpSocket>bytesAvailable()>0)
{
QByteArray datagram
datagramresize(tcpSocket>bytesAvailable())
tcpSocket>read(datagramdata()datagramsize())
QString msgdatagramdata()
contentListWidget>addItem(msgleft(datagramsize()))
}
}
4程序运行测试结果
基UDP模式
图26 服务器端窗口
图27 客户端窗口
说明:
开服务器端口输入字符(英文字符)时开客户端服务器端点击开始钮便时钟间隔客户端发送输入字符时显示客户端窗口直点击停止钮终止发送
二基TCP模式
图28服务器端窗口
图29 客户端窗口
说明:
操作方式类似UDP点击发送进行客户端服务器间话
5程序设计中遇问题改进思路
1 出现field 'm_createDate' has incomplete type错误头文件中加class声明class QDateTimecpp文件中#include
2.出现QApplication No such file or directory报错检查工程文件中*pro中否QT + widgets没需工程文件*pro增加条:QT + widgets问题解决
3.出现error 'tr' was not declared in this scopetr函数QObject象中静态成员函数时候果类写话会报错误需tr函数前加QObject:QObjecttr(a button)样
题目3简单浏览器实现
1设计容
简单浏览器实现:
设计简单浏览器
基求:
菜单项工具条实现开新网页指定功
提高求:菜单项工具条实现述功:
清动密码历史记录
浏览器址栏历史址清
清空时目录
2设计分析述程序实现流程框图
Qt5开始应层编程QNetworkRequestQNetworkReplyQNetworkAccessManager高层次类
中网络请求QnetworkRequest类表示作请求关信息统容器创建请求象时指定URL决定请求协议目前支持HTTPFTP文件URLs传载QnetworkAccessManager类协调网络操作请求创建该类调度发射信号报告进度网络请求应答QnetworkReply类表示会请求完成调度时QnetworkAccessManager创建
新建Qt Gui应名称myHTTP类名MainWindow完成进入设计模式开ui界面设计界面拖入Text Browser窗口然头文件源文件中加入相应代码
图31 浏览器服务器连接程
图32 ui界面设计
3关键实现代码注解
1进入mainwindowh文件首先添加类前置声明:
class QNetworkReply Line56类前置声明
class QNetworkAccessManager
2添加私象定义:
QNetworkAccessManager *manager
3添加私槽声明:
private slots
void replyFinished(QNetworkReply *)私槽声明面私象
4mainwindowcpp文件中添加头文件:
#include
然构造函数中添加代码:
manager new QNetworkAccessManager(this)首先创建QNetworkAccessManager类实例发送网络请求接收应答
connect(managerSIGNAL(finished(QNetworkReply*))thisSLOT(replyFinished(QNetworkReply*)))关联理器finished()信号定义槽网络应答结束时会发射信号
manager>get(QNetworkRequest(QUrl(httpwwwbaiducom)))get()函数发送网络请求请求QNetworkRequest类表示get()函数返回QNetworkReply类象
5添加槽定义:
void MainWindowreplyFinished(QNetworkReply *reply)
{
QString all reply>readAll()
ui>textBrowser>setText(all)
reply>deleteLater()
}
QNetworkReply继承QIODevice类操作般IO设备样操作该类里readAll()函数读取应答数完成数读取需deleteLater()删reply象
4程序运行测试结果
先实现网页文字链接显示图33
图33
然查阅网资料完成完整浏览器设计输入网址浏览网页网页添加收藏夹生成浏览历史记录图3435
图34
图35
5程序设计中遇问题改进思路
1 tr进行语言国际化时会出现错误:error 'tr' was not declared in this scope解决方法:程序中加入#include
2 编译时遇No rule to make target 'xxxcpp' needed by 'debugxxxo' Stop问题出现该问题原pro文件中包含某cpp文件h文件项目中该文件未直接删掉该文件pro文件中包含两文件引时编译会出现问题解决办法pro文件中删xxxcppxxxh引
题目4利smtp协议发送邮件
1设计容
利smtp协议发送邮件
基求:
发送容文信息邮件
提高求:
发送带附件信息邮件
2设计分析述程序实现流程框图
SMTP称简单邮件传输协议(Simple Mail Transfer Protocal)目标户提供高效邮件传输重特点够传送中接力传送邮件邮件通网络机接力式传送通常工作两种情况:邮件客户机传输服务器二某服务器传输服务器SMTP请求响应协议监听25号端口接收户Mail请求远端Mail服务器建立SMTP连接
SMTP通常两种工作模式发送SMTP接收SMTP具体工作方式:发送SMTP接收户邮件请求判断邮件否邮件直接投送户邮箱否DNS查询远端邮件服务器MX记录建立远端接收SMTP间双传送通道SMTP命令发送SMTP发出接收SMTP接收应答反方传送旦传送通道建立SMTP发送者发送MAIL命令指明邮件发送者果SMTP接收者接收邮件返回OK应答SMTP发送者发出RCPT命令确认邮件否接收果SMTP接收者接收返回OK应答果接收发出拒绝接收应答(中止整邮件操作)双方反复次接收者收全部邮件会接收特序列入伏哦接收者成功处理邮件返回OK应答
SMTP连接发送程致:
(1)建立TCP连接
(2)客户端发送HELO命令标识发件身份然客户端发送MAIL命令服务器端正希OK作响应表明准备接收
(3)客户端发送RCPT命令标识该电子邮件计划接收RCPT行服务器端表示否愿意收件接收邮件
(4)协商结束发送邮件命令DATA发送
(5)表示结束输入容起发送出
(6)结束次发送QUIT命令退出
3关键实现代码注解
1SMTPpro文件中加入代码次读取工程目录中文件夹容:
SOURCES + \
srcemailaddresscpp \
srcmimeattachmentcpp \
srcmimefilecpp \
srcmimehtmlcpp \
srcmimeinlinefilecpp \
srcmimemessagecpp \
srcmimepartcpp \
srcmimetextcpp \
srcsmtpclientcpp \
srcquotedprintablecpp \
srcmimemultipartcpp \
srcmimecontentformattercpp \
srcmaincpp \
srcsendemailcpp
HEADERS + \
srcemailaddressh \
srcmimeattachmenth \
srcmimefileh \
srcmimehtmlh \
srcmimeinlinefileh \
srcmimemessageh \
srcmimeparth \
srcmimetexth \
srcsmtpclienth \
srcSmtpMime \
srcquotedprintableh \
srcmimemultiparth \
srcmimecontentformatterh \
srcsendemailh
OTHER_FILES + \
LICENSE \
READMEmd
FORMS + \
srcsendemailui
2maincpp中文件类型设置Utf8:
QTextCodecsetCodecForLocale(QTextCodeccodecForName(UTF8))
QTextCodecsetCodecForCStrings(QTextCodeccodecForName(UTF8))
QTextCodecsetCodecForTr(QTextCodeccodecForName(UTF8))
3sandemailcpp中添加代码定义ui界面中槽函数:
SendEmailSendEmail(QWidget *parent) QWidget(parent) ui(new UiSendEmail)
{
ui>setupUi(this)
this>setFixedSize(710 556)
设置 发送邮件服务器 SMTP
ui>host>setEnabled(false)
ui>host>setText(smtp163com)
设置端口
ui>port>setEnabled(false)
ui>port>setValue(25)
ui>port>setValue(25)
发送方式
ui>ssl>setEnabled(false)
ui>ssl>setVisible(false)
ui>ssl>setChecked(true)
ui>label_7>setVisible(false)
隐藏认证
ui>label_4>setVisible(false)
ui>auth>setVisible(false)
ui>auth>setChecked(true)
ui>username>setFixedHeight(20)
ui>username>setFocus()
ui>username>selectAll()
ui>username>setToolTip(u8设置 发件邮箱)
ui>password>setToolTip(u8设置 发件密码)
ui>sender>setReadOnly(true)
ui>sender>setToolTip(u8发送者
ui>recipients>setToolTip(u8接收者1
ui>clearAttachment>setFixedSize(ui>addAttachment>width() 23)
connect(ui>username SIGNAL(textChanged(QString)) this SLOT(onteTextChange(QString)))
}
4sendemailcpp中添加代码实现发送邮件功:
void SendEmailon_sendEmail_clicked()
{
检查必条件
QMessageBox msgWarning (this)
QString user ui>username>text()trimmed()
if(userisEmpty())
{
msgWarningsetText(u8请设置\户名\)
msgWarningexec()
ui>username>setFocus()
return
}
QString password ui>password>text()trimmed()
if(passwordisEmpty())
{
msgWarningsetText(u8请设置\密码\)
msgWarningexec()
ui>password>setFocus()
return
}
QString strSender ui>sender>text()trimmed()
if(strSenderisEmpty())
{
msgWarningsetText(u8请设置\发件\)
msgWarningexec()
ui>sender>setFocus()
return
}
QString strRecipient ui>recipients>text()
if(strRecipientisEmpty())
{
msgWarningsetText(u8请设置\发件\)
msgWarningexec()
ui>recipients>setFocus()
return
}
准备发送邮件
QString host ui>host>text()
int port ui>port>value()
bool ssl ui>ssl>isChecked()
bool auth ui>auth>isChecked()
EmailAddress *sender stringToEmail(ui>sender>text())
QString subject ui>subject>text()
QString html ui>texteditor>toHtml()
SmtpClient smtp (host port ssl SmtpClientSslConnection SmtpClientTcpConnection)
MimeMessage message
messagesetSender(sender)
messagesetSubject(subject)
QStringList rcptStringList ui>recipients>text()trimmed()split('')
删空联系
while(rcptStringListsize() > 0 && rcptStringListlast()trimmed()isEmpty())
{
rcptStringListremoveLast()
}
for (int i 0 i < rcptStringListsize() ++i)
messageaddRecipient(stringToEmail(rcptStringListat(i)))
MimeHtml content
contentsetHtml(html)
messageaddPart(&content)
for (int i 0 i < ui>attachments>count() ++i)
{
MimeAttachment *temp new MimeAttachment(new QFile(ui>attachments>item(i)>text()toUtf8()))
temp>setEncoding(MimeAttachmentQuotedPrintable)
messageaddPart(temp)
}
if (smtpconnectToHost())
{
errorMessage(u8SMTP 链接失败\n请确认SMTP服务器否设置正确)
return
}
if (auth)
if (smtplogin(user password))
{
ui>username>setFocus()
ui>username>selectAll()
errorMessage(u8登录失败\n请确认户名 密码否正确)
return
}
if (smtpsendMail(message))
{
errorMessage(u8邮件发送失败\n请确认\收件\否正确)
ui>recipients>setFocus()
ui>recipients>selectAll()
return
}
else
{
QMessageBox okMessage (this)
okMessagesetText(u8邮件发送成功)
okMessageexec()
}
smtpquit()
}
5程序ui界面设计图41:
图41
设计完ui界面定义钮定义槽函数程序够实现发送邮件功
4程序运行测试结果
图42
图42运行结果网站邮箱应端口号163邮箱端口号25程序默认163邮箱情况端口号默认25
图43
图43网页开邮箱显示收刚刚发送邮件
5程序设计中遇问题改进思路
1.开始设计登录密码验证时出现报错现象发现新版Qt库引调整网查设计户名密码登陆时果户名密码正确会调调父类QDialogaccept()槽函数该函数实现关闭前话框设置话框运行结果QDialogAccepted发送QDialogfinished(int result)信号
2.更改错误处代码重新运行时发现编译错误窗口法跳出Qt中果需重新构建工程话(里指QtCreator建立工程)需删QtCreator生成旧工程名相关文件般删文件:MakefileMakefileDebugMakefileRelease*prouser目录releasedebug然更改*pro文件名字重新开工程编译
课程设计节
次课程设计完成获取机网络信息基TCPUDP通信设计简单浏览器利SMTP协议实现发送邮件等务实验周开始题目时点知措通网查阅资料图书馆阅相关书籍概清楚次实验需解背景知识
通次课程设计灵活应学编程知识独立完成问题分析结合QT理知识编写程序求解指定问题初步掌握软件开发程问题分析系统设计程序编码测试等基方法技提高综合运学理知识方法独立分析解决问题力系统观点软件开发般规范进行软件开发巩固深化学生理知识提高编程水程中培养严谨科学态度良工作作风熟练掌握QT界面设计基操作实现够利QT带函数命令完成需求通次实验Qt优点深解诸优良跨台特性丰富APIQt包括达250C++类提供基模板collectionsfileIO devicedirectory managementdatetime类尤Qt良封装机制Qt模块化程度非常高重性较设计界面说非常方便
设计程中学相互探讨相互学相互监督学会合作学会宽容学会理解学会做处世课程设计专业课程知识综合应实践训练迈社会事职业工作前必少程次课程设计仅学期学知识种综合检验动手力种提高增强实践力通次课程设计明白知识较欠缺学书知识远远够会东西太学需长期积累学工作中应该断学课理知识生活中实践知识相结合断提高文化知识实践力
实验程中非常感谢实验指导老师指点教导
附录
参考文献
[1] 龚丽浅谈Qt中布局理[J]电脑知识技术:学术交流20149:58835886.
[2] 陆文周Qt5开发实例[M]北京:电子工业出版社2014:357386.
设计成绩评定
评分容
具体求
总分
评分
机时间
机时间否达求学时实际情况定成绩
10分
报告审阅结果
报告结构严谨文字通语符合技术规范图表清楚书写格式规范雷
30分
验收结果
原理
原理清楚较理解课题务提出实施方案
20分
完成情况
独立完成规定设计务证分析设计计算结构建模实验正确合理定创新
30分
操作
熟练操作相关工具软件利工具软件完成设计务
10分
总成绩(五分制)
100分
指导教师评阅意见
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档