Qt聊天程序课程设计报告

重庆科技学院

《嵌入式Linux应用程序开发》

课程设计报告

院(系):_电气与信息工程学院_ 班级:计科普XXXX 学生姓名: XXX 学号:

设计地点(单位)___ _ __________ _______

设计题目:_____ 聊天程序设计_________________________

完成日期: 2013 年 7 月 11 日

指导教师评语: _______________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________

成绩(五级记分制):______ __________

教师签名:_________________________

嵌入式系统是软件和硬件的综合体,嵌入式系统是与应用紧密结合的,具有很强专用性,必须结合实际系统需求进行合理的裁减利用。

嵌入式linux在电子行业的应用很广泛,学习嵌入式linux显得非常重要。这次课程设计的主要目的是检验上学期学习linux后的效果。通过基础题的代码编写,熟悉linux C语言编程技巧。通过完成聊天程序的设计,熟悉linux底层编程。利用QT设计界面,缩短开发时间。

关键字:嵌入式linux、聊天程序、QT

题目一基础题 (3)

1.二小题 (3)

2.六小题 (3)

3.八小题 (3)

题目二聊天程序设计 (5)

1.系统需求分析 (5)

1.1聊天程序的基本要求 (5)

1.2设计参数 (5)

1.3设计的实现方案 (5)

1.4需实现的主要功能 (5)

2.总体设计 (6)

2.1客户端设计 (6)

2.2服务端设计 (6)

3详细设计 (8)

2.1客户端设计 (8)

2.1.1 传送消息设计 (8)

2.1.1 传送文件设计 (8)

2.2服务端设计 (10)

2.2.1连接设计 (10)

2.2.2数据传送设计 (10)

4设计总结 (13)

5 致谢 (14)

6 参考文献 (15)

课程设计任务书设计题目:基础题目

学生姓名

课程名称嵌入式linux应用

与开发课程设计

专业班级计科普1001

地点起止时间2011-8-29至2011-9-9

设计内容及要求GCC编译器的使用,LINUX系统C程序设计编译、调试方法

1、编写程序将数组内容倒置a[]=”123456789”。

2、利用指针将数据A的内容复制到数据B。

3、创建两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并

发执行的。

4、创建两线程,A线程通过消息队列发消息,B线程收到后在屏幕打印输出,要求两线程个

打印出线程号和消息内容。

5、创建两线程,A线程循环打印数组a[100],B线程循环将数组成员+1,要求利用互斥锁,

使每次输出a[0]==a[99].

6、创建两线程,A线程每2秒打印一次字母A,B线程每秒打印一次字母B,要求利用同步

信号量,使输出字母B总是在A之后。

8、通过Makefile,将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确。

第一周之内完成参

考资料1、嵌入式Linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2010.7

2、ZLG ARMMAGIC2410实验指导、资料。

其它

课程设计任务书

设计题目:聊天程序设计

学生姓名

课程名称嵌入式linux应用

与开发课程设计

专业班级计科普1001

地点起止时间2013-7-1至2012-7-12

设计内容及要求1、在QT(或miniGUI)编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天

2、QT(或miniGUI)界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。

选作:发送文件。

做完基础题目之后开始做本题目。

参考资料1、嵌入式Linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2010.7

2、ZLG ARMMAGIC2410实验指导、资料。

其他

说明

1.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。2.若填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。

系主任:易军指导教师:

2013年7 月 1 日

题目一基础题

1.二小题

(1)编写程序将数组内容倒置a[]=”123456789”。

(2)程序如下:

#include

int main()

{

char a[]="0123456789"; ①

char tmp;

int i = 0,j = 0;

for(i = 0,j = strlen(a)-1;i<=strlen(a)/2-1;i++,j--) ②

{

tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

for(i = 0;i

printf("%c",a[i]);

printf("\n");

}

2.六小题

(1)创建两线程,A线程循环打印数组a[100],B线程循环将数组成员+1,要求利用互斥锁,使每次输出a[0]==a[99].

(2)程序源代码如下:

3.八小题

(1)通过Makefile将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确。

(2)编写静态库程序thread.c如下:

#include

void pf1(void)

{

printf("********\n");

return;

}

void pf2(void)

{

printf("#########\n");

return;

}

该程序定义两个函数,分别打印不同的内容,该程序将被编译成.a静态库编写调用程序call.c如下:

extern void pf1(void);

extern void pf2(void);

int main(void)

{

pf1();

pf2();

return 0;

}

该程序对静态库进行调用,调用静态库中的两个函数pf1和pf2。

编写Makefile如下:

CC=gcc

CPPFLAGS=-c

OBJS = thread.o

SOURCE = thread.c

CALL_SOURCE=call.c

LIB = libthread.a

EXEC=call

AR=ar

thread: ${OBJS}

${CC} -c ${SOURCE} -o ${OBJS}

${AR} rcsv $(LIB) thread.o

${CC} -o ${EXEC} ${CALL_SOURCE} -L. -lthread

.PHONY : clean

clean :

-rm -f ${OBJS} ${EXEC} ${LIB}

Makefile文件实现对静态库程序编译成.a静态库,并且编译调用静态库的程序call.c为可执行文件call

题目二聊天程序设计

1.系统需求分析

1.1 聊天程序的基本要求

1、在QT编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文

本聊天。

2、QT界面设计至少包括“发送”,“重置”两个按钮,要求必须把目标机的硬件

键盘映射到QT设计的软件界面中,实现软件按钮的功能。

1.2 设计参数

(1)系统分析、设计正确。

(2)下载到硬件平台后正常启动和显示。

(3)界面简洁、美观。

(4) 报告格式规范。

1.3 设计的实现方案

在实现的过程中,我们首先要运用QT编译工具,对要实现内容的基本界面进行设计,布局完成之后,再对各个模块进行编程实现,最后再对整体进行优化设计,使得编写好的软件能够顺利流畅的运行。

1.4 需实现的主要功能

1、能够实现两个客户端之间的连接与通信。

2、能够实现客户端向服务器端的文件传输。

2.总体设计

2.1客户端设计

客户端是用户要用到的界面,因此我们在设计完其主要功能后要对界面进行简单易懂的设计。其界面如图2.1所示:

图2.1 客户端界面

2.2服务端设计

在客户端的设计过程中,我们对其设置了两个主要的功能,即文件的传输与消息的传输,所以我们首先要进行判断,再次,我们将传输内容的第一个字节作为标示,如果第一个字母是F,那么说明我们要传输的是文件,于是我们调用文件传输的程序,将文件传输到服务端。如果第一个字母是M,那么说明我们要传输的是消息,于是我们调用消息传输的程序。其流程图如图2.2所示:

图2.2 服务端设计流程图

3详细设计

2.1客户端设计

2.1.1 传送消息设计

传送设计主要包括文件的传输与消息的传输,消息的传送相对简单,主要是将以前的内容与现在的内容全部显示,程序如下所示:

void MainWindow::on_send_clicked()

{

QString msg;

msg = 'M' + ui->name->toPlainText() + '\n';

if(ui->sendBox->toPlainText() != "")

{

msg += QString(ui->sendBox->toPlainText()) + '\n';

sct.write(msg.toLatin1()); //to char

}

}

2.1.1 传送文件设计

文件的传送相对复杂,我们首先要得到文件的路径,然后将文件的基本消息写入数据流,程序将根据这些基本消息传送文件,其次还要判断文件的传输状态,程序如下所示:

void MainWindow::on_sendFile_clicked()

{

fileName = QFileDialog::getOpenFileName(this);//get the load

qDebug(fileName.toLatin1());

localFile = new QFile(fileName);

if(!localFile->open(QFile::ReadOnly))

{

qDebug() << "Open file error!";

return ;

}

totalBytes = localFile->size();

QDataStream sendOut(&outBlock, QIODevice::WriteOnly);

QString curFileNmae = fileName.right(fileName.size() - https://www.360docs.net/doc/3f9374413.html,stIndexOf('/') - 1);

sendOut <

totalBytes += outBlock.size();

bytesWritten = outBlock.size();

sendOut.device()->seek(1);//

sendOut << totalBytes << qint64((outBlock.size() - sizeof(qint64) * 2));

bytesToWrite = totalBytes - sct.write(outBlock);

outBlock.resize(0);

while(1)

{

if(bytesToWrite > 0)

{

int t;

outBlock = localFile->read(qMin(bytesToWrite, loadSize)); t = (int)sct.write(outBlock);

bytesToWrite -= t;

bytesWritten += t;

outBlock.resize(0);

}

else

{

localFile->close();

}

if(bytesWritten == totalBytes)

{

totalBytes = 0;

bytesWritten = 0;

bytesToWrite = 0;

break;

}

}

}

2.2服务端设计

2.2.1连接设计

服务端要对运行过程中,首先要对客户端发过来的连接请求进行处理,因为只有将各个客户端通过服务器端进行连接,才能实现其他方面的要求,如发送文件、发送消息等。如果连接成功,那么将会显示“Connection success\n”,其程序如下:

void MainWindow::recvReques()

{

QTcpSocket *tmp;

tmp = new QTcpSocket(this);

tmp = TcpSv.nextPendingConnection();//

connect(tmp, SIGNAL(readyRead()), this, SLOT(recvMsg()));

olPeople << tmp;

for(int i = 0; i < olPeople.size(); ++i)

{

if(olPeople[i] == tmp)

{

olPeople[i]->write("Connection success\n");

}

}

qDebug("new connection");

}

如程序中所示,程序通过函数connect(tmp, SIGNAL(readyRead()), this, SLOT(recvMsg()));实现两端的连接。

2.2.2数据传送设计

在数据的传送过程中我们首先要判断要传输的数据是是文件还是消息,在这里,我们用数据的第一个字母来确定,如果是F,那么就会传输文件,如果是M,那么就会传输消息,另外,如果是文件,那么我们还要判断传输的状态,其程序如下所示:

void MainWindow::recvMsg()

{

QString str;

QTcpSocket *tmp = (QTcpSocket *)sender();

QString type;

if(bytesReceived == 0)

{

type = QString(tmp->read(1));

}

if(bytesReceived == 0 && type == QString('M'))

{

str = tmp->read(100);

for(int i = 0; i < olPeople.size(); ++i)

{

if(olPeople[i] != tmp)

{

olPeople[i]->write(str.toLatin1());

}

}

}

else if(bytesReceived != 0 || (type == QString('F') && bytesReceived == 0))

{

QTcpSocket *tmpTcp = (QTcpSocket *)sender();

QDataStream in(tmpTcp);

if(bytesReceived <= sizeof(qint64) * 2)

{

if((tmpTcp->bytesAvailable() >= sizeof(qint64) * 2) && (fileNameSize == 0))

{

in >> totalBytes >> fileNameSize;

bytesReceived += sizeof(qint64) * 2;

}

if((tmpTcp->bytesAvailable() >= fileNameSize) && (fileNameSize != 0))

{

in >> fileName;

bytesReceived += fileNameSize;

localFile = new QFile(fileName);

if(!localFile->open(QFile::WriteOnly))

{

qDebug() << "Open file error!";

return;

}

}

else return;

}

if(bytesReceived != totalBytes)

{

if(bytesReceived < totalBytes)

{

bytesReceived += tmpTcp->bytesAvailable(); inBlock = tmpTcp->readAll();

localFile->write(inBlock);

inBlock.resize(0);

}

}

else if(bytesReceived == totalBytes)

{

totalBytes = 0;

bytesReceived = 0;

fileNameSize = 0;

localFile->close();

}

}

}

4设计总结

通过这次嵌入式linux程序设计和编程,对linux的编程有了更深的了解。特别是对QT编程有了很大的进步,通过测试,编写的程序都能顺利运行。由于时间紧迫,对服务器部分没有用QT来设计界面,只是编写客户端的QT程序,并成功仿真运行。

在编写代码的过程中,我非常认真,努力解决BUG。

5 致谢

在此次的大作业的制作过程中,我遇到了很多的问题,这时我们就必须要身边的老师和同学进行请教,每当这个时候,无论是老师或者是同学,都会耐心细致的给我讲解我遇到的问题。即使不会,也会跟我一起慢慢的研究,直到问题被解决,这才使得我能够在规定的时间里完成大作业的设计,同时也是我掌握了更多的知识,掌握以前不懂得理论。为此,我要向老师及同学致谢。

6 参考文献

【1】鸟哥,《鸟哥的linux私房菜》,

【2】 christopher negus,《Linux 命令详解手册》【3】《Unix/Linux》编程实践教程

【4】《精通Linux设备驱动开发》

相关文档
最新文档