- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
姓名:学号:班级:专业:指导老师:
姓名:
学号:班级:专业:
指导老师:
提交日期:2013年06月14日
计课程设计A报告书
1、实验项目目的
《Linux 操作系统课程设计B》是一门在课程《Linux 操作系统与程序设计B》后独立开设的实验课程。这一门实验课程的开设目的是为了通过学生独立完成一个基于Linux 平台的较大型应用程序,巩固课堂上学到的Linux平台上的编程规范、技术和技巧,培养学生的编写较大型程序的能力和提高学生综合应用素质。
本课程设计实验主要围绕Linux 平台上主流的基础技术展开,这些技术包括:Linux 的进程、线程通信和同步技术;socket 网络通信技术等,这些技术可以集中体现并应用在并发程序设计中。通过并发程序的设计与开发,培养学生底层软件开发的能力,并为将来从事UNIX/Linux 平台开发、嵌入式开发等相对高端的软件开发工作打下基础。
2、实验项目的功能及模块划分
本软件是一个Linux 下基于socket 的聊天室程序,能让局域网内的用户通过该软件进行简单的文字通信。在此基础上增加了
聊天室成员之间的发送私聊信息;
当新的成员加入后能自动收取最近一段时间内的聊天上下文;用户能够查看历史聊天记录;
软件界面基于Qt实现,图形化界面方便用户操作。主要模块划分:
服务端:
数据包发送和接受模块,聊天记录数据库读写模块,数据包处理模块,聊天记录查询模块
客户端:
数据包发送和接受模块,数据包处理模块,聊天记录查询模块,用户界面与展示模块
3、设计与实现
本系统采用CS架构,服务端采用固定的端口通信,每个客户端动态设置端口。客户端启动后向服务端告知自己所使用的端口号,以便可以双向通信,同时服务器负责为每个客户端分配一个唯一的ID(服务器的ID为1)
服务端初始化服务端初始化解析数据包接受数据包
服务端初始化
服务端初始化
解析数据包
接受数据包
接受数据包
解析数据包
Soceket通信
服务端数据处
理
发送数据(可
选)
发送数据(可
选)
客户端数据处
理
通知界面线程更
新和显示数据
客户端或用户
主动发送消息
通知界面线程更新
和显示数据
数据包通用格式定义如下#defineMAX_UDP_SIZE1000structudp_packet{
inttype;
intsenderId;longsize;
charcontent[MAX_UDP_SIZE];
};
type: 表示该数据包的类型,直接决定content 字段的含义senderId:该数据包的发送者的ID,
size:整个数据包的数据长度
content:数据包的内容,其数据格式由type决定。
服务器和客户端接受到数据包后,根据type字段的值来解析content 字段的数据,从而作出正确的处理和响应。
所有的数据包类型以及对应的content 字段的数据结构全部定义在define.h 文件中
由上图可以看出,服务器和客户端程序在总体结构上相似。服务器和客
户端的全部功在数据处理模块中实现,这也是整个程序的核心之处
由于数据包的接受在单独的线程中完成,而界面采用Qt实现。因此在接受线程中采用QCoreApplication::postEvent() 方法向界面线程发送通知事件,在界面窗口中通过重载customEvent() 方法响应该通知,然后从Server中获取数据并显示。整个过程中涉及到线程同步和多线程安全问题,觉采用信号量和互斥量解决。
4文件操作
聊天记录的保存是通过文件的操作实现的具体代码
voidChatClient::saveRecord(){saveRecords(chatRecords.txt);
}
voidChatClient::saveRecords(constQStringfileName){QFilefile(fileName);
if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr(Application),
tr(Cannotwritefile%1:\n%2.)
.arg(fileName).arg(file.errorString()));
return;
}
QTextStreamout(file);
outchatBox-toPlainText();
}
5、测试与调试
I ^--client |
骈天室IP: 端口:C55二)畔:(
欢
文档评论(0)