基于终端的
UDP云聊天系统
-
- 开发环境
Linux 系统+GCC+UDP+makefile+sqlite3
-
- 功能描述
通过 UDP 网络使服务器与客户端进行通信吗,从而实现云聊天。
-
-
- Sqlite数据库
-
用户在加入聊天室前,需要先进行用户登录或注册操作,并将注册的用户信息:用户ID,用户账号,用户密码。使用数据库进行统一存储。(使用如下结构体类型进行用户信息的注册)
typedef struct user{
int id;
char account[12];
char password[12];
}usr_t;
-
-
- 客户端功能描述
-
客户端运行后,先出现登陆界面,进行云聊天系统的登录或注册操作。登录成功后选择是否与服务端进行连接,连接后把账号信息发送给服务端,服务端验证后,把登录结果通知其他客户端。(客户端流程图如图1-1所示)
通过云聊天登录后用户可以完成以下操作:
- 进入聊天室,与其他成员进行聊天。
- 向服务端上传文件
- 从服务端获取文件
- 查看以往的聊天记录
- 退出聊天系统
客户端流程图 图1-1
-
-
- 服务端功能描述
-
服务端启动后,等待客户端链接。完成以下操作(服务端流程图如图1-2所示)
- 接收用户的登陆
- 接收用户需要访问的信息
- 保存用户上传文件
- 将某个用户发送的消息传递给其他用户
客户端与服务器基于 UDP 链接。服务器通过链表记录保存用户信息。
服务端流程图 图1-2
-
-
- Sock 编程
-
启动服务端程序,监听端口,等待客户端连接。完成客户端于服务端简单的 UDP 连接。使用 I/O 复用机制完成客户端与服务端之间的一对多的连接。服务端记录每个客户端的基本信息:每个客户端的 IP、端口等基本信息。使用链表记录保存这些信息。
-
-
- 数据包协议
-
客户端使用 UDP 连接服务端后,发送接受数据使用数据封包。封包格式如下:协议版本,数据包类型,数据包的内容。
协议版本:发送端填充自己的该数据包的版本信息,服务端接受数据包后,查看该版本是否是自己能识别的版本。是则进行解析,否则作为非法数据包(一般丢弃)。
数据包类型:发送端根据自己发送的数据包里面的数据内容的不同填充不同的类型。如:如果数据包的数据信息是登录信息,数据类型为整型 1。如果是断开连接的信息则数据类型为整型 2。这样接收端接受到数据之后就可以根据数据类型的值,对数据做不同的处理数据包内容:要发送的数据。
数据包发送者:在发送数据前,在数据前增加数据包头。数据包头包含以上的包头信息。
封包可以采用数据结构:
typedef struct message{
int type;//数据信息
int id;//用户 ID
char text[128];//消息正文
}msg_t;
数据包接受端:接受到数据后,分成两次读取一个数据包,第一次读取首先读取一个数据包头长度,然后根据数据包头中的数据长度读取整个数据包。这样一个一个的数据包就分别被读取出来。
数据包协议总结:协议是数据的收发端之间一种约定要好的一种规定。发送者按照该格式发送,接受者按照该格式进行解析。
-
-
- 聊天成员数据管理
-
服务端接收所有客户端的信息,将所有加入聊天室的成员使用链表统一管理。(用户信息:用户ID,用户端口号)
聊天信息:用户名,聊天信息
数据包内容:要发送的数据。
服务端通过如下结构体类型创建结点,对用户信息进行存储。
typedef struct node{
struct sockaddr_in caddr;
struct node *next;
int id;
int len;
}node_t;
-
-
- Makefile多文件编译
-
通过使用makefile多文件编译简化了编译流程。每次只需要执行make即可完成编译,不需要把全部的源文件都重新编译,优化了编译流程。
如果源文件发生修改,Makefile会检查文件的时间戳,如果有文件时间戳更新(该文件就会重新生成),只需要重新编译发生修改的源文件即可,节省了编译时间。