1.1 畅聊博客
1.2.1 平台开发和环境简介
Linux系统 + Gcc + Gdb + makefile
1.2.2 功能描述
通过网络实现跨主机畅聊分享服务平台,包括服务端,客户端。
用户客户端描述:客户端运行开始出现登陆界面。与服务端进行连接,连接后把账号信息发送给服务端,服务端验证后,把确认结果通知客户端。通过验证后用户可以完成以下操作:
登录界面:
- 用户如果有账号密码,则将账号密码发给服务器,服务器验证账号密码,正确则进入个人操作页面。如果账号密码输入错误,则提示密码错误请重新输入。
- 用户如果没有账号密码,则可以选择注册操作。将注册好的账号密码发给服务器,服务器接受到账号密码信息,进行保存。
个人操作界面:
- 用户选择发布操作,编写一篇文章,将文章内容发送给服务器端,从而完成发布操作。
- 用户通过操作界面可以将自己想要看的相关内容发给服务器,服务器会在数据库中轮询,把轮询到的内容发送给客户端,从而实现搜索功能。
- 用户选择搜索功能,如果收到内容,界面会显示文章名字,文章内容,评论以及点赞。如果没有该内容,提示内容为空。当用户成功读取到内容后,可以进行以下操作。
- 本地下载操:将读取的内容下载下来。
- 评论操作:对此内容进行评论,将评论信息发送给服务器进行保存。
- 点赞操作:对该内容进行点赞。
- 私聊操作:给文章作者发送一个消息,仅文章作者可读。
- 用户选择浏览功能,界面会显示所有文章的信息。
- 用户选择小世界操作时,用户会进入聊天界面,可以接收到所以进入小世界用户发来的消息。
- 用户打开个人中心,界面会显示该用户的名称,已发布的作品,和该作品的评论数和点赞量。如果此前有用户私信作者,则界面会提示:你有消息未读。用户点击读取,该消息会变成已读状态,下次则不会提示。
服务端功能描述:服务端启动后,等待客户端连接。完成以下服务:
- 接受用户的注册信息,用户名不可以重复。
- 接受用户登录。
- 用户操作页面处理。处理基本流程如下:
- 接收用户发布请求,将发布的内容保存下来。
- 接收用户搜索请求,将相关内容发送给用户,没有则发送一个错误码。
C、接收用户下载请求,将文章内容发送给用户。
d、接收用户评论请求,将评论信息保存起来。
e、接收用户点赞请求,将该文章点赞加一。
f、接收用户私聊请求,将私聊信息保存起来,直到该信息被发送,才将其删除。
g、接收用户浏览请求,将服务器所有文章信息发送给用户。
h、接收用户聊天请求,将聊天信息发送给所有用户。
i、接收用户查看该信息请求,将该用户的信息发送给他。
客户端与服务端之间使用tcp协议进行通讯。
7.2.3 设计实施
一、配置文件读取
服务端程序启动后读取配置文件,配置文件中包含要监听使用的IP、端口等信息。
配置文件格式可以参考/etc/目录下的各种服务的配置文件。
配置文件一般规则:
1、在配置文件中每一行是作为一条配置;
2、每条配置有两个项:配置项名称(配置变量名)、配置项值;
3、“#”之后的内容为注释;
4、配置文件命名:xxx.conf
二、Sock编程
根据配置文件信息启动服务端程序,监听端口,等待客户端连接。完成客户端于服务端简单的tcp连接。使用I/O复用机制完成客户端与服务端之间的一对多的连接。服务端记录每个客户端的基本信息:每个客户端的IP、端口等基本信息。使用链表记录保存这些信息。
三、数据包协议
客户端使用TCP连接服务端后,发送接受数据使用数据封包。封包格式如下:
| 协议版本(1) | 数据包类型(1)| 数据包的长度(2)| 数据包的内容(变长)|
协议版本:发送端填充自己的该数据包的版本信息,服务端接受数据包后,查看该版本是否是自己能识别的版本。是则进行解析,否则作为非法数据包(一般丢弃)。
数据包类型:发送端根据自己发送的数据包里面的数据内容的不同填充不同的类型。
如:如果数据包的数据信息是登录信息,类型为0x0001。如果是断开连接的信息则类型为0x0002。这样接收端接受到数据之后就可以根据数据类型的值,对数据做不同的处理。
数据包的长度:TCP是数据流协议,数据发送者多次发送的数据,但在tcp的接受端缓冲区内数据与数据之间没有间隔。无法分开。所以在数据包中增加一项数据长度。这样接收端可以根据数据长度信息确定本数据包的长度,确定要从tcp的缓冲区内每次要读取的长度。
数据包内容:要发送的数据。
数据包发送者:在发送数据前,在数据前增加数据包头。数据包头包含以上的包头信息。封包可以采用数据结构:
struct pack_head
{
unsigned char ver;
unsigned char type;
unsigned short len;
char buf[0];//buf指针作为数据包的缓冲的包头。
};
数据包接受端:接受到数据后,分成两次读取一个数据包,第一次读取首先读取一个数据包头长度,然后根据数据包头中的数据长度读取整个数据包。这样一个一个的数据包就分别被读取出来。
数据包协议总结:协议是数据的收发端之间一种约定要好的一种规定。发送者按照该格式发送,接受者按照该格式进行解析。
四、数据管理
服务端接收所有客户端发来的信息,将客户端发来的账号信息,文章信息保存在数据库中,又给客户端的文章评论,私聊信息各自建立对应的表进行保存。
五、心跳机制
客户端每隔一定时间想服务端发送一个数据包(可以包含GPS位置),该数据包用途主要使用证明客户端存在,网络没有断开,客户端程序本身也没有出现任何问题。就像证明自己活着一样。如果客户端每隔1分钟发送一个心跳包给客户端。如果服务端超过3分钟没有接收到客户端的心跳包,则认为该客户端已经死亡(网络断开或者客户端程序出现问题)。
提示:可以在客户端使用I/O复用机制,使用I/O复用中的超时机制进行定时。
7.2.4 项目要求
1、采用C语言完成代码的编写。
2、编写makefile管理整个项目。
3、编写项目设计书。
4、以模块化编写项目代码,按照不同模块组织 .h/.c 文件。
5、规范代码格式并添加注释。
6、编写测试报告,包括单模块测试,模块间测试。
7、编写项目总结,包括项目设计说明、项目中采用的知识点列举、项目中遇到的问题及解决方法等。
7.2.5 项目完成参考步骤
可以按一下步骤,以每个步骤作为一个目标,一步一步完成项目。
1、完成服务端与客户端1对1的tcp连接
2、实现服务端与客户端1对多的tcp连接,并且服务端建立在线用户。可以使用数组或者链表保存。服务端每当接受客户端连接时保存客户端的相关信息至在线用户列表。当连接断开后把该客户端从列表中删除。
3、实现在线用户注册、登陆。
4、实现在线用户表的同步:让每个客户端可以得到服务端维护的在线用户表。
5、实现日志、配置文件、心跳、守护进程等功能。