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


    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、确定软件题目(学生可...

    11年前   
    20024    0

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

    XX大学理学院( 计算机网络 )课程设计实验时间: 2010学年第二学期 专业年级: 2008级应数X班 ...

    3年前   
    566    0

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

    1.掌握在Visual C++6.0环境下C程序的建立、编辑、编译和执行过程。2.掌握C程序的最基本框架结构,完成简单程序的编制与运行。3.了解基本输入输出函数scanf()、printf ()...

    2年前   
    416    0

    C语言程序设计实验报告

    C语言程序设计实验报告  实验名称 计算出1000以内10个最大素数之和   实验目的   1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语...

    10年前   
    922    0

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

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

    5年前   
    3479    0

    XX大学实验报告模版

    XX 大 学 实 验 报 告 课程名称: 实验项目名称: ...

    2年前   
    546    0

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

    面向对象程序设计(C++)实验报告姓名:学院:数学与计算机学院 班级:10级计算机大类班 学号:实验5 单继承一、实验目的1.掌握派生的类别与方式; ...

    3年前   
    1062    0

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

    《C语言程序设计》 实验报告第二学期班 级 学 号姓 名指导教师实验一 Visual C++ 6.0编程环境与C语言程序的调试过程一、实验学时2 学时。二、...

    11个月前   
    227    0

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

    C语言实验报告《逻辑结构程序设计》  学号:__________    姓名:__________    班级:__________    日期:__________   指导教师:_____...

    12年前   
    729    0

    网络通信公司年鉴

    网络通信公司年鉴 【概况】公司在各级领导和社会各界的大力支持下,以自身网络优势致力于业务发展,以综合信息化优势致力于行业应用。对内坚持求真务实,强化经营管理;对外加强多方合作,拓展市场空间。...

    12年前   
    12481    0

    大学生假期实验报告

    大学生假期实验报告  1.报告题目  报告题目应该用简短、明确的文字写成,通过标题把实践活动的内容、特点概括出来。题目字数要适当,一般不宜超过20个字。如果有些细节必须放进标题,为避免冗长,可...

    11年前   
    552    0

    大学物理演示实验报告

    大学物理演示实验报告  学物理演示实验报告--避雷针  一、演示目的   气体放电存在多种形式,如电晕放电、电弧放电和火花放电等,通过此演示实验观察火花放电的发生过程及条件。   二、原理  ...

    8年前   
    716    0

    大学物理实验报告

    大学物理实验报告  摘要:热敏电阻是阻值对温度变化非常敏感的一种半导体电阻,具有许多独特的优点和用途,在自动控制、无线电子技术、遥控技术及测温技术等方面有着广泛的应用。本实验通过用电桥法来研究...

    11年前   
    614    0

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

    计算机网络实验报告册实验一 交换机基本配置实验学时:2学时实验类型:验证实验要求:必修一、实验目的1.掌握桌面网络组建方法2.掌握 Quidway S系列中低端交换机几种常见配置方法二、实验...

    3年前   
    572    0

    软件设计基本原则

    软件基本设计原则l 友好、简洁的界面设计l 结构、导向清晰,符合国际标准l 强大的综合查询l 信息数据共享l 方便及时的信息交流板块l 准确、可逆的科技工作流模块支持l 良好的开放性和可扩展性...

    10个月前   
    370    0

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

    网络通信公司实习报告范文  学生姓名:李xx  实习单位:co-exceed  实习时间:xx.12.03-xx.12.07  本人为中北大学信息商务学院08级电子信息工程专业三班的实习生李x...

    9年前   
    413    0

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

    软件设计师大学学习的自我鉴定  进入的大学的第一天开始,我已经步进了一个崭新的生活,向着理想迈进了一大步。以下就本人的学习生活来作一个自我鉴定:  在学习方面上,按照自己定制的学习计划,每一天...

    9年前   
    520    0

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

    光电图像处理实验报告精仪学院 测控班 实验1 离散图像的傅立叶变换。1. 实验内容及步骤:(1)利用Matlab图像处理软件进行离散图像傅立叶变换,如给...

    2年前   
    436    0

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

    大学物理实验课程设计实验报告  北方民族大学    大学物理实验(设计性实验)    实验报告   指导老师:王建明    姓    名:张国生    学    号:XX0233    学  ...

    9年前   
    709    0

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

    数值分析实验报告 一、 实验3.1题目:考虑线性方程组,,,编制一个能自动选取主元,又能手动选取主元的求解线性代数方程组的Gauss消去过程。(1)取矩阵,,则方程有解。取计算矩阵的条件数...

    3年前   
    794    0

    文档贡献者

    z***u

    贡献于2019-05-22

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档