华东交通大学理工学院毕业
基于QT的网络聊天系统设计
摘 要
越来越多的嵌入式终端需要一个图形化的接口界面,良好的人机交互界面是嵌入式系统设计的一个关键技术。特别是嵌入式的手持设备,比如手机,笔记本电脑等。它对于嵌入式的实用性,美观性,和娱乐性都提供了极大地帮助,随着科学技术的高速发展,移动手持设备的网络功能已经非常成熟了,人们对手持设备网络软件的需求也日益增加,开发基于嵌入式终端的网络聊天系统软件具有很大的使用意义和价值。
本文的目标是实现基于QT的网络聊天系统设计,论文开始接受了Linux的优点和QT用于开发嵌入式图形界面的优点,着重分析了QT在软件开发中的编程机制。并根据嵌入式应用的特点对嵌入式终端下的网络聊天系统进行了需求分析,概要设计,详细设计。最后对关于论文的进一步的改进方向进行了简要的分析。
本文讨论的内容采用QT软件进行图形界面设计,利用软件自带的库,实现软件界面的设计,
本次研究实现类似于QQ的网络聊天方式,多个客户端可同时登陆服务器,并且客户端之间可进行通信。
关键词:嵌入式;QT;网络聊天
Abstract
目 录
中文摘要
英文摘要
目录
引言
第一章 Linux和QT的简介
第二章 软件需求分析
第三章 网络聊天系统的概要设计
第四章 网络聊天系统的详细设计
第五章 系统测试
第六章 系统运行和维护
第七章 结语
第八章 参考文献
第九章 附录
第十章 后记
引 言
随着嵌入式产品的高速发展,大多数嵌入式操作系统拥有网络和图形界面的工程。利用源代码开发的Linux搭建的嵌入式操作系统,拥有Linux具有开源,完全免费,和其强大的网络功能,越来越多的嵌入式产品都采用Linux操作系统。它能提供全功能的桌面计算,并且支持大多数嵌入式操作系统上使用的芯片,包括ARM,Power PC和MIPS等。在嵌入式上使用轻量级,高性能,高可靠,可配置的GUI系统成为可行的解决
。
虽然市场上出现了许多优秀的图形界面可发软件,但是随着计算机技术的高速发展,当新硬件,新技术出现时,计算机的体系结构,www.of110.com www.meidm.com www.of111.com www.zhuc.cn,指令系统,和操作系统都可能发生相应的变化,这势必会导致一部分应用软件在新的平台上无法运行,可移植性不行,但是QT基于跨平台的特点,它能解决这个问题,极大地提高了应用程序的可移植性。
因此,利用Linux做基于Qt的嵌入式聊天系统的开发是一个非常有意义的课题,具有非常重要的研究和商业价值。
第一章 Linux和QT的简介
1.1 Linux的主要特性
(1)符合POSIX1003.1
POSIX1003.1标准定义了一个最小的Unix操作系统接口,任何操作系统只有符合这一标准才能运行Unix程序。
(2)支持多用户访问和多任务编程
Linux是一个多用户操作系统,它允许多个用户同时访问系统而不会造成用户之间的干扰。另外,LInux还支持多用户编程,一个用户可以创建多个进程,并使它们协同工作以完成用户的需求。
(3)采用页式存储管理
页式管理使Linux能更有效的利用物理存储空间,页面的换入换出为用户提供更大的存储空间。
(4)支持动态链接
用户的程序的执行往往离不开标准库的支持,多数操作系统一般采用静态链接方式--即在编译阶段就把用户程序和标准库链接好,这样当用多个进程运行时,可能会造成库代码在内存中有多个副本而浪费空间。而Linux支持动态链接方式--即用户程序在运行阶段才把库链接进来,这样就能保证库代码在内存中时唯一的,可以节省内存空间。
(5)支持多文件系统
Linux支持多文件系统,目前支持的文件系统有:EXT2,EXT3,XIAFS,ISOF,MSDOS,UMSDOS,PROC,NFS,SYSV,MINIX,SMB,UFS,NCP,VFAT等。Linux最常用的文件系统是EXT2,它的文件名程度可达255个字节。
(6)支持TCP/IP,SLIP和PPP协议
在Linux中用户可以使用所有的网络服务,如NFS,telnet等。SLIP和PPP能支持串行线上的TCP/IP协议的使用,这意味着用户可用一个高速的调制解调器(Modem)通过电话线连入Internet网中。
1.2 QT的主要特性
QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组建编程等特点,更引人注目的是目前Linux上最流行的KDE桌面环境就是建立在QT库的基础上的。QT支持一下平台:MS/WINDOWS-95、98、NT 和 2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED- 支持 framebuffer 的 Linux 平台.
信号和槽机制是QT编程的核心机制。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心机制也是QT区别于其它工具包的重要地方。
Qt具有跨桌面和嵌入式操作系统的移植性。使用 Qt只需一次性开发应用程序,就可跨不同桌面和嵌入式操作系统进行部署,而无须重新编写源代码。
具有跨平台 IDE 的集成开发工具:Qt Creator 是专为满足 Qt 开发人员需求而量身定制的跨平台集成开发环境 (IDE)。Qt Creator 可在 Windows、Linux/X11 和 Mac OS X 桌面操作系统上运行,供开发人员针对多个桌面和移动设备平台创建应用程序。
第二章 软件需求分析
2.1 系统客户要求
需求分析是软件开发中的一个重要步骤,它的基本任务就是要准确地分析出系统应用者的需要,以及系统目标必须具备哪些工程,这些工程必须准确的体现出用户的要求。
根据网络聊天系统的特点,它应该能实现即时通讯的功能。客户端和服务器应该具有不同的功能,其中服务器的主要工程就是管理客户端的登陆信息,包括账号、密码、在线状况、昵称等,而客户端的主要功能就是实现能够连接服务器,注册用户,登陆服务器,并且能实现客户端之间的通信。并随时更新用户的信息。
2.2 网络聊天系统架构分析简介
网络聊天系统分为客户端和服务器两部分,其中服务器运行在PC机上,客户端可运行在开发板上,亦可运行在PC机上。首先服务器开始监听,然后客户端通过注册,登陆服务器,然后客户端之间即可进行通信。
2.3 网络聊天系统界面设计
(1)服务器界面如图1所示;
服务器提供了所有注册了的用户的用户名,密码,昵称和登录状态信息,方便对用户信息进行管理。
(2)客户端登录模块界面显示如图2所示;
客户端登录模块类似于QQ的登陆界面,只是它多了连接服务器的IP地址和端口号。
(3)客户端注册模块界面显示如图3所示;
客户端注册模块可以让新用户注册信息。
(4)客户端好友列表界面显示如图4所示;
好友列表模块显示用户好友和自己的用户名和登陆状态。
(5)客户端聊天界面如图5所示;
客户端聊天模块可以让用户与其他用户通信。
图1 服务器主界面
图2 客户端登录模块主界面
图3 注册模块界面
图4 好友列表界面
图5 聊天界面
2.4 网络聊天系统架构图
2.4.1 服务器架构图
服务器结构图如图6所示:
图6 服务器结构图
2.4.2 客户端架构图
客户端结构图如图7所示:
图7 客户端结构图
2.5 系统开发目标
(1) 实现好友登陆,当好友登陆或离开时,服务器能即时通知所有的在线用户。
(2) 收发信息同步,当一个用户想其他的好友发送消息是,相应的用户能即时接受消息。
2.6 开发环境
软件环境:Ubuntu10.11
硬件环境:1GB以上的CPU,500MB以上的内存
第3章 网络聊天系统的概要设计
根据调查和研究,得到系统所要处理的数据流程如图8所示:
图8 网络聊天系统数据流程图
3.1服务器的具体实现
(1)解决中文乱码的关键代码:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
其头文件为#include
.
(2)使用数据库保持用户信息,需要用到如下库:
#include
#include
其中QSqlDatabase库代表一个数据库的连接,QSqlQuery提供了执行Sql命令的方法。
使用方式如下:
QSqlQuery query;
Query.exec(“DROP TABLE scooter”);
数据库的操作还涉及到库 QSqlTableModle,该类为单一的数据库表提供了可编辑的模型。使用方法如下:
Model = new QSqlTableModle(this);
Modle->settable(“scooter”);
Model->setSort(Scooter_Name,Qt::AscendingOrder);
Model->select();
(3)打开和关闭监听的关键技术:
当要用QString类型的变量保持IP地址和端口号信息时,可使用方法trimmed(),它可以去除最前面和最后面多输入的空格。
可以使用QMessageBox类来给出提示信息,例如:
QMessageBox::critical(NULL,
tr(“Warnning”),tr(“error!”));
(4)使用Udp协议来通信使用方法如下:
添加头文件#include
Udpsocket = new QUdpSocket(this);
If(!udpsocket->bind(QHostAddress(ip),(quint16)port+1)){
QMessageBox::critical(NULL,”Warnning”,”error!”);
}
Connect(udpsocket,SIGNAL(readyRead()),this,SLOT(recvMsg()));
3.2 客户端的具体实现
客户端主要有4个大模块界面:登陆模块,注册模块,好友列表模块,通信模块。下面对这4个模块分别进行概要的分析。
3.2.1 登陆模块
可以使用resize方法来设置窗口的大小,从而实现显示部分窗口的功能,具体使用如下:
this->resize(366,231);
在登陆模块还有如下关键代码:
Socket->abort();
Socket->connectToHost(QHostAddress(ip),(quint16)port.toInt());
Connect(socket,SIGNAL(readyRead()),this,SLOT(recvmsg()));
其中abort()方法用来关闭套接字,并且重新设置套接字。
3.2.2 注册模块
注册模块主要使用的关键技术是正则表达式,头文件是
#include
使用方式如下:
QRegExp rx(“^[1-9]/{1,2}[0-9]{4,7}$”);
表示前面1到2个是1-9中的某个数,后面跟着的是4到7个0到9的数字。其中^表示锁定开头,$表示锁定结尾。具体使用如下:
QRegExp rx(“^[1-9]{1,2}[0-9]{4,7}”);
Rx.setPatternSyntax(QRegExp::RegExp);
If(!rx.exactMatch(username))
{QMessageBox::warning(NULL,tr(“warning”),tr(“username error”));
}
3.2.3 好友列表模块
好友表面模块主要是显示好友上线信息,和好友列表,使用Udp协议接受服务器带来的信息。当双击某好友用户时,机会弹出与相应好友的对话框。具体实现将在详细设计阶段说明。
3.2.4 通信模块
通信模块是使用Udp协议进行通信的,因为它不必建立连接。
第四章 网络聊天系统的详细设计
4.1 服务器模块
服务器和客户端通信既有通过TCP/IP协议,也有通过UDP协议进行通信的。其中用户下线和用户信息更新时使用UDP协议,而用户登录,注册时使用TCP协议,使用数据库保持用户信息。
/////////server.cpp文件////////////////////////////
#include "server.h"
#include "ui_server.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
Server::Server(QSqlDatabase *db, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Server)
{
ui->setupUi(this);
server = new QTcpServer(this);
this->setWindowTitle("JY2012_QQServer");
ui->pushButton_2->setText("StartListen");
ip.clear();
port.clear();
this->db = db;
displayView();
}
Server::~Server()
{
delete ui;
}
////////////Open Listen or Close Listen////////////////////
void Server::on_pushButton_2_clicked()
{
ip.clear();
port.clear();
ip = ui->lineEdit->text().trimmed();//去除最前面和最后面多余的空格
port = ui->lineEdit_2->text().trimmed();
if(ui->pushButton_2->text() == "StartListen")
{
if(!server->listen(QHostAddress(ip),(quint16)port.toUInt()))
{
QMessageBox::critical( NULL, tr("Warning"), tr("Listen error") );
}
else
{
connect(server,SIGNAL(newConnection()),this,SLOT(NewConnection()));
udpsocket = new QUdpSocket(this);
if(!udpsocket->bind(QHostAddress(ip),(quint16)port.toUInt() + 1))
{
QMessageBox::critical(NULL,tr("Warning"),tr("bind udpsocket error").arg(udpsocket->errorString()));
}
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readDatagrams()));
ui->pushButton_2->setText("StopListen");
ui->lineEdit->setEnabled(false);
ui->lineEdit_2->setEnabled(false);
}
}
else if(ui->pushButton_2->text() == "StopListen")
{
server->close();
ui->pushButton_2->setText("StartListen");
ui->lineEdit->setEnabled(true);
ui->lineEdit_2->setEnabled(true);
}
}
void Server::NewConnection()
{
qDebug() << "connected";
socket = server->nextPendingConnection();
connect(socket,SIGNAL(readyRead()),this,SLOT(recvMsg()));
}
void Server::recvMsg()
{
QByteArray block;
block = socket->readAll();
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
quint16 datagramSize;
QString msgType;
in >> datagramSize >> msgType;
qDebug() << datagramSize << "**" << msgType;
if(msgType == "REGISTER")
{
QString username;
QString passwd;
QString nickname;
QString state = "off";
int flag = 0;
in >> username >> passwd >> nickname;
qDebug() << username << 999;
QSqlQuery query;//用来输入数据库命令的
if(!(query.exec("select username from scooter")))
{
QMessageBox::critical(NULL, "exec", "Exec failed.(select username from scooter)");
return;
}
insertUser(username,passwd,nickname,state);
}
else if(msgType == "LOGIN")
{
idList.clear();
nickList.clear();
stateList.clear();
QString id;
QString passwd;
in >> id >> passwd;
qDebug() << "id,passwd" << id << " " << passwd;
QSqlQuery query;
if(!(query.exec("SELECT username,passwd FROM scooter")))
{
QMessageBox::critical(NULL, "exec", "Exec failed.");
return;
}
while (query.next())
{
if(query.value(0).toString() == id && query.value(1).toString() == passwd)
{
qDebug() << "User login success";
QSqlQuery query2;
query2.exec("update scooter set state='on' where username=:username");
query2.bindValue(":username",id);
if(!query2.exec())
{
QMessageBox::critical(NULL,"error","exec failed(update scooter set state='on' where username=:username)");
return;
}
query2.exec("select username,nickname,state from scooter");
while(query2.next())
{
idList.append(query2.value(0).toString());
nickList.append(query2.value(1).toString());
stateList.append(query2.value(2).toString());
}
qDebug() << idList << nickList << stateList <<"***********";
on_pushButton_clicked();//刷新列表
QString msgType = "UPDATE";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << idList << nickList << stateList;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
//发送更新信息给所有的同一网段用户
udpsocket->writeDatagram(block.data(),block.size(),
QHostAddress::Broadcast,6666);
return;
}
}
if(!query.next())
{
QString msgType = "LOGIN _FAILED";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
return;
}
}
}
bool Server::openDB()
{qDebug() << 111;
qDebug() << 222;
db->setDatabaseName("scooters.dat");
qDebug() << 333;
if (!db->open()) {
qDebug() << 444;
QMessageBox::warning(0, QObject::tr("Database Error"),
db->lastError().text());
return false;
}
qDebug() << 555;
return true;
}
int Server::insertUser(QString id, QString passwd, QString nickname,QString state)
{
QSqlQuery query;
if (!(query.exec("SELECT username FROM scooter")))
{
QMessageBox::critical(NULL, "exec", "Exec failed.(SELECT username FROM scooter)");
return -1;
}
//This id already exist
while (query.next())
{
if ( query.value(0).toString() == id)
{
qDebug() << "User has existed";
QString msgType = "REGISTER_FAILED";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << idList << nickList << state;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
return 0;
}
}
//‘:’表示在后面给定值
query.exec("INSERT INTO scooter (username,passwd,nickname,state)"
"VALUES (:username,:passwd,:nickname,:state)");
query.bindValue(":username",id);
query.bindValue(":passwd",passwd);
query.bindValue(":name",nickname);
query.bindValue(":state",state);
if(!query.exec())
{
QMessageBox::critical(NULL,"error","exec failed.(INSERT INTO scooter (username,passwd,nickname,state)...)");
return -1;
}
displayView();
QString msgType = "REGISTER_SUCCESS";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
return 1;
}
void Server::closeDB()
{
db->close();
}
void Server::displayView()
{
model = new QSqlTableModel(this);
model->setTable("scooter");
model->setSort(Scooter_Name, Qt::AscendingOrder);
model->select();
ui->tableView->setModel(model);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setColumnHidden(Scooter_Id, true);
ui->tableView->resizeColumnsToContents();
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = ui->tableView->horizontalHeader();
header->setStretchLastSection(true);
}
void Server::readDatagrams()·
{
qDebug() << "udp receive data....................";
while(udpsocket->hasPendingDatagrams())
{
QByteArray block;
block.resize(udpsocket->pendingDatagramSize());
if ( -1 == udpsocket->readDatagram(block.data(), block.size(), &senderIp, &senderPort))
continue;
processDatagram(block);
}
}
void Server::processDatagram(QByteArray block)
{
qDebug() << "receive Msg";
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
quint16 datagramSize;
QString msgType;
in >> datagramSize >> msgType;
qDebug() << datagramSize << "*udp*" << msgType;
if(msgType == "OFF_LINE")
{
QString myId;
QString myNick;
in >> myId >> myNick;
QSqlQuery query2;
query2.exec("update scooter set state='off' where username=:username");
query2.bindValue(":username",myId);
if(!query2.exec())
{
QMessageBox::critical(NULL,"error","exec failed(update scooter set state='off' where username=:username)");
return;
}
query2.exec("select username,nickname,state from scooter");
idList.clear();
nickList.clear();
stateList.clear();
while(query2.next())
{
idList.append(query2.value(0).toString());
nickList.append(query2.value(1).toString());
stateList.append(query2.value(2).toString());
}
qDebug() << idList << nickList << stateList <<"***********";
on_pushButton_clicked();
QString msgType = "UPDATE";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << idList << nickList << stateList;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
udpsocket->writeDatagram(block.data(),block.size(),
QHostAddress::Broadcast,6666);
return;
}
}
/////////////// update data ////////////////
void Server::on_pushButton_clicked()
{
delete model;
displayView();
}
///////////////// close event /////////////////////
void Server::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton button;
button = QMessageBox::question(this,tr("waring"),
"Are you going to disconnect the Server?",
QMessageBox::Yes|QMessageBox::No);
if(button == QMessageBox::No)
{
event->ignore();
}
else if(button == QMessageBox::Yes)
{
QSqlQuery query2;
if(!query2.exec("update scooter set state='off'"))
{
QMessageBox::critical(NULL,"error","exec failed(update scooter set state='off')");
return;
}
event->accept();
}
}
4.2 客户端登录模块
#include "client.h"
#include "ui_client.h"
#include
#include
#include
#include
#include
#include
Client::Client(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
this->resize(366,231);//设置窗口的大小
this->setWindowTitle("JY2012_QQClient");
ui->lineEdit_3->setText("127.0.0.1");
ui->lineEdit_4->setText("8888");
checked = 0;
}
Client::~Client()
{
delete ui;
}
////////////////////Setting_PushButton //////////////////////////////
void Client::on_toolButton_4_clicked()
{
if(checked)
{
qDebug() << 111;
checked = 0;
this->resize(366,231);
ui->toolButton_4->setChecked(true);
}
else
{
qDebug() << 222;
checked = 1;
this->resize(366,409);
ui->toolButton_4->setChecked(false);
}
}
////////////////////Setting_Ensure PushButton///////////////////////
void Client::on_pushButton_6_clicked()
{
ip = ui->lineEdit_3->text();
port = ui->lineEdit_4->text();
this->resize(366,231);
checked = 0;
ui->toolButton_4->setCheckable(true);
}
///////////////Login/////////////////////////////
void Client::on_pushButton_3_clicked()
{
username = ui->lineEdit->text();
passwd = ui->lineEdit_2->text();
socket->abort();//关闭套接字,并且重新设置套接字
socket->connectToHost(QHostAddress(ip),(quint16)port.toUInt());
connect(socket,SIGNAL(readyRead()),this,SLOT(recvMsg()));
QString msgType = "LOGIN";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << username << passwd;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
}
///////////Register///////////////
void Client::on_toolButton_clicked()
{
registerDlg = new Register(ip,port);
registerDlg->show();
}
void Client::recvMsg()
{
QByteArray block;
block = socket->readAll();
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
quint16 datagramSize;
QString msgType;
in >> datagramSize >> msgType;
qDebug() << datagramSize << "**" << msgType;
if(msgType == "UPDATE")
{
QStringList idList;
QStringList nickList;
QStringList stateList;
in >> idList >> nickList >> stateList;
QMessageBox::information(NULL,"information","login success");
showUserListDlg(idList,nickList,stateList);
}
else if(msgType == "LOGIN _FAILED")
{
QMessageBox::warning(NULL,"warning","login failed");
}
}
Void Client::showUserListDlg(QStringListid List,QStringList nickList,QStringList stateList)
{
qDebug() << 1111;
listDlg = new UserList(idList,nickList,stateList);
listDlg->ip = ip;
listDlg->port = port;
listDlg->myId = ui->lineEdit->text();
for(int i = 0;i < idList.count();i++)
{
if(idList.at(i) == listDlg->myId)
{
listDlg->myNick = nickList.at(i);
}
}
qDebug() << 2222;
listDlg->show();
qDebug() << 3333;
socket->close();
this->close();
}
void Client::on_pushButton_5_clicked()
{
this->close();
}
//////////////Cancle_pushButton///////////////////
void Client::on_pushButton_7_clicked()
{
this->resize(366,231);
ui->toolButton_4->setChecked(true);
}
3.2 注册模块
#include "register.h"
#include "ui_register.h"
#include
#include
#include
Register::Register(QString ip, QString port, QWidget *parent) :
QDialog(parent),
ui(new Ui::Register)
{
ui->setupUi(this);
this->ip = ip;
this->port = port;
socket = new QTcpSocket(this);
socket->connectToHost(QHostAddress(ip),(quint16)port.toUInt());
connect(socket,SIGNAL(readyRead()),this,SLOT(recvMsg()));
}
Register::~Register()
{delete ui;}
void Register::recvMsg()
{
QByteArray block;
block = socket->readAll();
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
quint16 datagramSize;
QString msgType;
in >> datagramSize >> msgType;
qDebug() << datagramSize << "**" << msgType;
if(msgType == "REGISTER_FAILED")
{
QMessageBox::warning(NULL,QObject::tr("Warning"),QObject::tr("register error,user has existed."));}
if(msgType == "REGISTER_SUCCESS")
{
QMessageBox::information(NULL,QObject::tr("register success"),QObject::tr("register success"));
socket->close();
this->close();
}
}
void Register::on_pushButton_clicked()
{
QString username = ui->lineEdit->text().trimmed();
QString passwd = ui->lineEdit_2->text().trimmed();
QString passwd2 = ui->lineEdit_3->text().trimmed();
QString nickname = ui->lineEdit_4->text().trimmed();
//////////////正则表达式//////////////////
QRegExp rx("^[1-9]{1,2}[0-9]{4,7}$");
rx.setPatternSyntax(QRegExp::RegExp);
if(!rx.exactMatch(username))
{QMessageBox::warning(NULL,QObject::tr("Warning"),QObject::tr("username error"));}
else if((passwd != passwd2) || passwd.size() == 0)
{ QMessageBox::warning(NULL,QObject::tr("Warning"),QObject::tr("Passwd error"));
}
else if(nickname.size() == 0)
{
QMessageBox::warning(NULL,QObject::tr("Warning"),QObject::tr("No has nickname"));
}
else
{
socket->abort();
socket->connectToHost(QHostAddress(ip),(quint16)port.toUInt());
QString msgType = "REGISTER";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << username << passwd << nickname;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
}
}
///////////////Cancel_pushButton////////////////
void Register::on_pushButton_2_clicked()
{
socket->close();
this->close();
}
4.3 好友列表模块
#include "userlist.h"
#include "ui_userlist.h"
#include
#include
#include
#include
#include
UserList::UserList(QStringList idlist, QStringList nicklist, QStringList statelist, QWidget *parent) :
QDialog(parent),
ui(new Ui::UserList)
{
ui->setupUi(this);
updateList(idlist,nicklist,statelist);
udpsocket = new QUdpSocket(this);
udpsocket->bind(6666);
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readDatagrams()));
}
UserList::~UserList()
{//////////////// UDP Send OFF_LINE msg /////////////////
delete ui;
}
void UserList::UdpInit()
{
udpsocket = new QUdpSocket(this);
udpsocket->bind(6666);
QString msgType = "NEW_CONNECTION";
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType;
out.device()->seek(0);}
void UserList::recvMsg()
{
QByteArray block;
QString msgType;
quint16 size;
QHostAddress peerIp;
quint16 peerPort;
block.resize(udpsocket->pendingDatagramSize()); this->udpsocket->readDatagram(block.data(),block.size(),&peerIp,&peerPort);
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
in>>size>>msgType;
qDebug() << msgType << "msgType";
}
void UserList::closeEvent(QCloseEvent *event)
{
QMessageBox::StandardButton button;
button = QMessageBox::question(this,tr("waring"),
"is disconnect this socket",
QMessageBox::Yes|QMessageBox::No);
if(button == QMessageBox::No)
{
event->ignore();
}
else if(button == QMessageBox::Yes)
{
qDebug() << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
QString msgType = "OFF_LINE";
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint16)0 << msgType << myId << myNick;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
udpsocket->writeDatagram(block.data(), block.size(), QHostAddress(ip), (quint16)port.toUInt()+1);
event->accept();
}
}
void UserList::readDatagrams()
{ QByteArray block;
QString msgType;
quint16 size;
QHostAddress peerIp;
quint16 peerPort;
block.resize(udpsocket->pendingDatagramSize());
this->udpsocket->readDatagram(block.data(),block.size(),&peerIp,&peerPort);
QDataStream in(&block,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_7);
in>>size>>msgType;
if ("UPDATE" == msgType)
{
QStringList idList2;
QStringList nickList2;
QStringList stateList2;
in >> idList2 >> nickList2 >> stateList2;
updateList(idList2,nickList2,stateList2);
}
}
void UserList::updateList(QStringList idlist, QStringList nicklist, QStringList statelist)
{
this->idList = idlist;
this->nickList = nicklist;
this->stateList = statelist;
qDebug() << stateList << "list";
for(int i = 0;i < idlist.count();i++)
{
ui->tableWidget->removeRow(0);
}
for(int i = 0;i < idlist.count();i++)
{
ui->tableWidget->insertRow(i);
QTableWidgetItem *id = new QTableWidgetItem(idList.at(i));
QTableWidgetItem *nickname = new QTableWidgetItem(nickList.at(i));
QTableWidgetItem *state2 = new QTableWidgetItem(stateList.at(i));
ui->tableWidget->setItem(i,0,nickname);
ui->tableWidget->setItem(i,1,id);
ui->tableWidget->setItem(i,2,state2);
}
ui->tableWidget->setColumnWidth(0,80);
ui->tableWidget->setColumnWidth(1,80);
ui->tableWidget->setColumnWidth(2,80);
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = ui->tableWidget->horizontalHeader();
header->setStretchLastSection(true);
}
UserList::on_tableWidget_itemDoubleClicked(QTableWidgetItem *item)
{
state = item->row();
QString id = idList.at(state);
chatDlg = new Chat(id);
chatDlg->show();
}
4.4 通信模块
通信模块主要使用UDP与相应的好友惊喜通信
关键代码如下:
void MyClient::recvMsg()
{
QByteArray tmp;
tmp.append(socket->readAll());
ui->textEdit->append(tmp);
}
void MyClient::on_Send_clicked()
{
QByteArray sendMsg;
QString tmp;
tmp.append(ui->SendText->toPlainText());
sendMsg.append(tmp);
socket->write(sendMsg);
}
原创性
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期: 年 月 日
导师签名: 日期: 年 月 日
注 意 事 项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期: 年 月 日
导师签名: 日期: 年 月 日
独 创 声 明
本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。
本声明的法律后果由本人承担。
作者签名:
二〇一〇年九月二十日
毕业设计(论文)使用授权声明
本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。
本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。
(保密论文在解密后遵守此规定)
作者签名:
二〇一〇年九月二十日
基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。
毕业论文的基本教学要求是:
1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。
毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。
毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。
撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。
2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。
3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。
论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。
按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。
按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。
按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。
另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类:
1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。
写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。
首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。
教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。
第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。
第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。
致 谢
这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。
通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。
即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期: 年 月 日
导师签名: 日期: 年 月 日
独 创 声 明
本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。
本声明的法律后果由本人承担。
作者签名:
年 月 日
毕业设计(论文)使用授权声明
本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。
本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。
(保密论文在解密后遵守此规定)
作者签名:
年 月 日
基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。
毕业论文的基本教学要求是:
1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。
毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。
毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。
撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。
2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。
3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。
论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。
按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。
按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。
按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。
另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类:
1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。
写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。
首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。
教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。
第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。
第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。
致 谢
这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。
通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。
即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。
58
_1234567890.vsd
�
�
启动客户端
注册?
填写账号和密码
登陆
双击在线好友
与好友通信
注册新用户
连接服务器
否
是