| 注册
home doc ppt pdf
请输入搜索内容

热门搜索

年终总结个人简历事迹材料租赁合同演讲稿项目管理职场社交

XX大学软件设计TCPIP网络通信程序设计实验报告

z***u

贡献于2019-05-22

字数:22049

201 201 学年 第二学期

课程设计 实验报告



模 块 名 称 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 listAddress hostInfoaddresses()获机IP址列表
if(listAddressisEmpty())获机IP址列表空空情况第IP址
{
LineEditAddress>setText(listAddressfirst()toString())
}
}
注释见[2]

5 slotDetail()函数获网络接口相关信息具体实现代码:

void NetworkInformationslotDetail()获网络接口相关信息
{
QString detail
QList listQNetworkInterfaceallInterfaces()QNetworkInterface类提供机IP址网络接口列表
for(int i0i {
QNetworkInterface interfacelistat(i)
detaildetail+u8设备:+interfacename()+\n获网络接口名称
detaildetail+u8硬件址:+interfacehardwareAddress()+\n获网络接口硬件址
QList entryListinterfaceaddressEntries()
网络接口包括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 Line1112声明Line2132添加槽函数
#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 tcpClientSocketList保存客户端连接TcpClientSocket
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 该类引入QDateTime m_createDate方式创建QDateTime象QDateTime类进行声明隐藏类实现时编译时知道QDateTime完成实现法创建QDateTime象解决方法头文件中#include 方式换class QDateTime

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解决方法:程序中加入#includeQObjecttr()

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 接收者2 ) 设置邮箱
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)户传

《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 香币 [ 分享文档获得香币 ]

该文档为用户出售和定价!

购买文档

相关文档

软件设计过程实验报告

 软件开发过程 实验一 软件需求分析 一、目的和意义 对本书第二和三章的内容做进一步的掌握,写出软件需求规格说明书。为下面的实习奠定基础。 二、实习内容 1、确定软件题目(学生可自己拟定,也可在本书附录2中选择); 2、分析软件需求以及人工模式下的工作流程; 3、编写需求规格说明书(需求规格说明书的编写要求参见本节模板参考); 4、完成形式:以文档的形式完成软件的需求规格说明

y***7 11年前 上传20045   0

基于TCPIP协议的网络通信小应用程序课程设计

XX大学理学院( 计算机网络 )课程设计实验时间: 2010学年第二学期 专业年级: 2008级应数X班 实验题目: 基于TCP/IP协议的网络通信应用程序 学生姓名: 学号 自评成绩_95教师评成绩___学生姓名: 学号

文***享 3年前 上传587   0

《高级语言程序设计》实验报告

1.掌握在Visual C++6.0环境下C程序的建立、编辑、编译和执行过程。2.掌握C程序的最基本框架结构,完成简单程序的编制与运行。3.了解基本输入输出函数scanf()、printf ()的格式及使用方法。4.掌握发现语法错误、逻辑错误的方法以及排除简单错误的操作技能。

w***2 2年前 上传440   0

C语言程序设计实验报告

C语言程序设计实验报告  实验名称 计算出1000以内10个最大素数之和   实验目的   1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。  2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循

大***6 10年前 上传953   0

《高级语言程序设计》实验报告

设计一种用单链表存储多项式的结构(每个结点存储一项的系数和指数,类型都为int)并编写一个产生多项式链表的函数和一个实现两个多项式相加和相乘的函数。

留***1 5年前 上传3510   0

XX大学实验报告模版

XX 大 学 实 验 报 告 课程名称: 实验项目名称: 学院: 专业

文***享 2年前 上传568   0

面向对象程序设计(C++)实验报告

面向对象程序设计(C++)实验报告姓名:学院:数学与计算机学院 班级:10级计算机大类班 学号:实验5 单继承一、实验目的1.掌握派生的类别与方式; 2.了解派生类中如何使用基类的成员、基类成员在派生类中的访问控制; 3. 掌握继承中构造函数和析构函数的调用过程。二、实验内容及步骤

文***品 3年前 上传1096   0

铜陵学院C语言程序设计实验报告

《C语言程序设计》 实验报告第二学期班 级 学 号姓 名指导教师实验一 Visual C++ 6.0编程环境与C语言程序的调试过程一、实验学时2 学时。二、实验目的1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运行一个C程序;2.通过运行简单的C程序,初步了解C源程序的特点。三、预习

文***享 1年前 上传251   0

C语言实验报告《逻辑结构程序设计》

C语言实验报告《逻辑结构程序设计》  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:__________    成绩:__________  实验二  逻辑结构程序设计  一、 实验目的  1、学会正确使用逻辑运算符和逻辑表达式  2、熟练掌握if语句和switch语句 

s***0 12年前 上传741   0

网络通信公司年鉴

网络通信公司年鉴 【概况】公司在各级领导和社会各界的大力支持下,以自身网络优势致力于业务发展,以综合信息化优势致力于行业应用。对内坚持求真务实,强化经营管理;对外加强多方合作,拓展市场空间。一年来,区域网络深度覆盖,服务水平持续提升,各项工作稳步、快速、和谐发展。 【网络覆盖】为加快通信发展,公司重点开展移动网络、G3网络、宽带网络建设。截止12月底,实现99%移动网络覆盖,乡镇区域全部实

2***龙 12年前 上传12493   0

大学生假期实验报告

大学生假期实验报告  1.报告题目  报告题目应该用简短、明确的文字写成,通过标题把实践活动的内容、特点概括出来。题目字数要适当,一般不宜超过20个字。如果有些细节必须放进标题,为避免冗长,可以设副标题,把细节放在副标题里。  2.学院及作者名称  学院名称和作者姓名应在题目下方注明,学院名称应用全称。  3.摘要(有英文摘要的中文在前,英文在后)  报告需配摘要,摘要应

1***3 11年前 上传558   0

大学物理演示实验报告

大学物理演示实验报告  学物理演示实验报告--避雷针  一、演示目的   气体放电存在多种形式,如电晕放电、电弧放电和火花放电等,通过此演示实验观察火花放电的发生过程及条件。   二、原理   首先让尖端电极和球型电极与平板电极的距离相等。尖端电极放电,而球型电极未放电。这是由于电荷在导体上的分布与导体的曲率半径有关。导体上曲率半径越小的地方电荷积聚越多(尖端电极处),两极之

中***县 8年前 上传730   0

大学物理实验报告

大学物理实验报告  摘要:热敏电阻是阻值对温度变化非常敏感的一种半导体电阻,具有许多独特的优点和用途,在自动控制、无线电子技术、遥控技术及测温技术等方面有着广泛的应用。本实验通过用电桥法来研究热敏电阻的电阻温度特性,加深对热敏电阻的电阻温度特性的了解。   关键词:热敏电阻、非平衡直流电桥、电阻温度特性   1、引言   热敏电阻是根据半导体材料的电导率与温度有很强的依赖关系而制

s***i 11年前 上传630   0

XX大学计算机网络实验报告

计算机网络实验报告册实验一 交换机基本配置实验学时:2学时实验类型:验证实验要求:必修一、实验目的1.掌握桌面网络组建方法2.掌握 Quidway S系列中低端交换机几种常见配置方法二、实验内容1. 通过 Console口搭建配置环境2. 通过 Telnet搭建配置环境3. 熟悉 VRP的各种视图及各视图下的常用命令三、实验原理、方法和手段1. 交换机配置方

文***品 3年前 上传586   0

软件设计基本原则

软件基本设计原则l 友好、简洁的界面设计l 结构、导向清晰,符合国际标准l 强大的综合查询l 信息数据共享l 方便及时的信息交流板块l 准确、可逆的科技工作流模块支持l 良好的开放性和可扩展性l 方案生命周期长设计原则:设计时考虑的总体原则是:它必须满足设计目标中的要求,并充分考虑本网站的基本约定,建立完善的系统设计方案。信息系统的实施作为信息化规划的实践和实现,必须遵循信

文***品 11个月前 上传386   0

软件设计师大学学习的自我鉴定

软件设计师大学学习的自我鉴定  进入的大学的第一天开始,我已经步进了一个崭新的生活,向着理想迈进了一大步。以下就本人的学习生活来作一个自我鉴定:  在学习方面上,按照自己定制的学习计划,每一天坚持将当日老师课堂上所讲的知识理解透彻并预习下一节课的知识,一步一步的,从大一的基础知识到大三的专业知识都有了很好的把握。根据自己的爱好,自学java编程,有了很好的java编程能力。  通过大

l***g 9年前 上传539   0

网络通信公司实习报告范文

网络通信公司实习报告范文  学生姓名:李xx  实习单位:co-exceed  实习时间:xx.12.03-xx.12.07  本人为中北大学信息商务学院08级电子信息工程专业三班的实习生李xx,从xx年12月3日至12月7日在北京协力超越科技公司进行了为期一周的实习活动。下面的内容就是有关于此次实习的心得总结。  此次实习由中北大学信息与通信工程学院和信息商务学院共同组织,

h***7 9年前 上传420   0

天津大学光电图像处理实验报告

光电图像处理实验报告精仪学院 测控班 实验1 离散图像的傅立叶变换。1. 实验内容及步骤:(1)利用Matlab图像处理软件进行离散图像傅立叶变换,如给出一幅图像(w01.tif),其傅立叶变换程序如下:>>i=imread('D:\w01.tif'); >>figure(1);>>imshow(i); >>colo

文***享 2年前 上传465   0

大学物理实验课程设计实验报告

大学物理实验课程设计实验报告  北方民族大学    大学物理实验(设计性实验)    实验报告   指导老师:王建明    姓    名:张国生    学    号:XX0233    学    院:信息与计算科学学院    班    级:05信计2班    重力加速度的测定    一、实验任务    精确测定银川地区的重力加速度    二、实验要

h***0 9年前 上传724   0

清华大学数值分析实验报告

数值分析实验报告 一、 实验3.1题目:考虑线性方程组,,,编制一个能自动选取主元,又能手动选取主元的求解线性代数方程组的Gauss消去过程。(1)取矩阵,,则方程有解。取计算矩阵的条件数。分别用顺序Gauss消元、列主元Gauss消元和完全选主元Gauss消元方法求解,结果如何?(2)现选择程序中手动选取主元的功能,每步消去过程都选取模最小或按模尽可能小的元素作为主元进行消元,

文***享 3年前 上传825   0

**大学离散数学实验报告

本实验的目的是判断关系的五种性质自反,反自反,对称,反对称,传递这五种关系。本实验采用的是离散数学知识,判断矩阵是不是具有这样的关系,然后输出矩阵的关系。

s***1 5年前 上传2847   0

软件设计毕业生自我评价

软件设计毕业生自我评价  作为一名软件专业的大学生,从不懂不爱程序,到喜欢并热爱上编程,这是个很大的转变。读文科上来的我曾认为自己的脑子会跟不上那逻辑的转动。但勤能补拙这是真理。更何况我并不拙。一个勤奋好学的我在大学的学习、生活和工作中都能给自己一个满意的鉴定。  四年里,对专业知识我一丝不苟,在学好本专业课程的同时我也特别注重对其他各科知识的学习与涉猎。图书馆、电子阅览室、期刊杂志室是

t***l 10年前 上传531   0

国标软件设计文档——软件构架文档

<项目名称>软件构架文档版本 <1.0>[注:以下提供的模板用于 Rational Unified Process。其中包括用方括号括起来并以蓝色斜体(样式=InfoBlue)显示的文本,它们用于向作者提供指导,在发布此文档之前应该将其删除。按此样式输入的段落将被自动设置为普通样式(样式=Body Text)。][要定制 Microsoft Word 中的自动字段(选

t***i 10年前 上传797   0

软件设计员实习日志

软件设计员实习日志   今天,师傅让我帮他修改图纸的图框。改的东西很少,就是把设计单位换一下。图框已经做成块了,只要把每个图纸的,图框块编辑一下,所有的图框就改好了。刚开始,我是和另一个实习生一起做的,但是他有事出去了一会,我做的比较快,就帮他的那份一起做了。他回来后,就负责检查我做的成果。由于我只图速度,没看到角落里一幅很小的图,漏改了。这幅图经过师傅的鉴定,已经是作废的图纸了,于是叫我在

j***1 12年前 上传12070   0

TCPIP协议与网络编程期末大作业

编号TCP/IP协议与网络编程期末大作业 题目: 基于Socket的网络通信 物联网工程 学院 计算机科学与技术 专业学 号 学生姓名 任课教师

文***享 3年前 上传488   0