Qt聊天程序课程设计报告

重庆科技学院

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

课程设计报告

院(系):_电气与信息工程学院_ 班 级: 计科普XXXX 学生姓名: XXX 学 号: 设计地点(单位)___ _ __________ _______ 设计题目:_____ 聊天程序设计_________________________ 完成日期: 2013 年 7 月 11 日

指导教师评语: _______________________________________ _________________________________________________________________________________________________________________________________________________________________________________________________________

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

教师签名:_________________________

摘要

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

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

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

1

目 录

题目一 基础题 ........................................................................................... 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

2

重庆科技学院

课程设计任务书

设计题目:基础题目

Qt聊天程序课程设计报告

1

重庆科技学院

课程设计任务书

设计题目:聊天程序设计

Qt聊天程序课程设计报告

系主任:易军 指导教师:

20xx年 7 月 1 日

2

题目一 基础题

1. 二小题

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

(2) 程序如下:

#include<stdio.h>

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<strlen(a);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 <stdio.h>

void pf1(void)

3

{

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

4

题目二 聊天程序设计

1.系统需求分析

1.1 聊天程序的基本要求

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

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

1.2 设计参数

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

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

(3)界面简洁、美观。

(4) 报告格式规范。

1.3 设计的实现方案

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

1.4 需实现的主要功能

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

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

5

2.总体设计

2.1客户端设计

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

Qt聊天程序课程设计报告

图2.1 客户端界面

2.2服务端设计

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

6

Qt聊天程序课程设计报告

图2.2 服务端设计流程图

7

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);

8

QString curFileNmae = fileName.right(fileName.size() - fileName.lastIndexOf('/') - 1);

sendOut <<qint8('F') << qint64(0) << qint64(0) << curFileNmae;//the size of file and the long of file's name

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;

}

}

}

9

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()

10

{

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;

}

}

11

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();

}

}

}

12

4设计总结

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

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

13

5 致谢

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

14

6 参考文献

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

【2】 christopher negus,《Linux 命令详解手册》

【3】《Unix/Linux》编程实践教程

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

15

相关推荐