下载链接
http://clearriver.download.csdn.net/
http://download.csdn.net/source/1816684
注:这是师弟妹们的一么课程的大作业,我就为了练练手来做的,时间比较仓促,里面有很多粗鲁的实现:
(1) 一些信号没有做处理
(2) 一些同步没有做
(3) 一些异常没有处理(比如说用户等输入不合理)
(4) ……
估计处理这些问题还需要一倍的代码量,就没有做了。希望不要拍的太厉害,呵呵 ~~~
1. 多人聊天程序功能
1) 支持用户并发请求(注册,登录,聊天)
2) 当用户登录时,应该提示其所有在线好友“自己已经在线”
3) 当用户退出时,应该提示其所有在线好友“自己已经下线”
4) 用户登录时除需要返回登录成功 / 失败信息,还要获取当前自己所有在线好友信息(好友谁在线?)
5) 添加好友(需验证?)
6) 删除好友(目前没有做,只要添加一个函数就可以了)
2. 服务器端实现
(1) fork 方式处理用户请求
a) 每个用户的注册和登录用一个子进程来处理
b) 为每一个新注册用户产生一个唯一 ID (在文件中保存当前 ID+1 ,作为下一个 ID )
c) 父进程维护一个所有在线用户的链表,子进程通过消息队列和父进程通信,获取其他在线用户信息,父进程有一个“ well-known ”的消息队列描述符,由“ server ”文件产生关键字获得
d) 每个用户有一个以其 ID 命名的文件“ user_id ”文件,该文件保存该用户的好友信息
e) 每个子进程(对应一个在线用户)维护一个在线好友的列表(数组或链表)
f) 用户之间通信子进程之间通过消息队列相互通信,消息队列描述符由“ user_id ”文件产生关键字获得
g) 假设注册和登录时并行的请求,其他请求(添加好友,聊天)都基于登录后进行。
h) 不同请求的状态机可以通过函数指针数组或者“ switch-case ”实现
3. 客户端实现
由于客户端和服务器所有的通信都是基于“头字段解析”的,所以需要定义一个简单的通信协议,协议格式如下:
消息类型( char ) | 源 ID ( long ) | 目的 ID ( long ) | 其他 |
用户端通过 IO 复用方式接受用户的输入和服务器端的返回,并维护相应的两个状态机。
状态机 1 :接受服务器端的返回,通过函数指针数组实现
状态机 2 :接受用户输入,通过 ”switch-case” 实现
4 ,关于消息类型的说明
在服务器和客户端都定义了大量的消息类型宏定义,看到名字就应该知道是什么意思。
其中有几个需要解释一下:
服务器端:
ON_LINE1 :当用户登录时,通过向服务器查询自己的当前在线好友“我的朋友都是谁在线?”,返回客户端。
ON_LINE2 :当一个用户登录时,告诉自己的所有在线好友“朋友们,我已经上线了”
客户端:
对应于服务器端的 ON_LINE1 和 ON_LINE2 ,客户端的的 SERV_FND_ON1 和 SERV_FND_ON2 同样是处理两种不同的“在线信息”。