项目名称:小区物业门禁卡系统
编码工具:red hat6.3 Linux下sublime text工具
编译工具:g++ makefile工程管理工具
代码总量:1800行左右
C/S架构: 一.client客户端 二.server服务器端
一:客户端概要设计:
0.TcpServer.h TcpClient.h :最底层的2个class,socket那一系列函数封装
socket bind listen accept send recv close
socket connect send recv close
0.Client.h Server.h 代理类,单例模式:代理Tcpserver TcpClient
1.System_cli.h :client系统:共运行3个线程:主线程 门禁卡收集器线程 接受服务器数据并用MVC处理数据线程
(6000端口号连接服务器)
1)主线程:登录 2)注册 3)退出
成功后进入下一层 contral_cli.h:insert delete search updata
接受管理员输入数据,json打包,发送给服务器
2.附线程a:接受服务器返回的数据Recver_cli.h :Constrator:create pthread
线程函数:接受数据string,解包,根据类型调用View中的函数处理
Contral_recv View_recv :MVC事物处理
3.附线程b:监听门禁卡登录时的刷卡信息 Collect_cli.h:libevent事件监听,门禁卡端口5000
接受5000端口发来的数据后,将数据加工,添加表示类型,发送给服务器
4.自定义Json协议:客户端发送协议and服务器端发送协议:[大写字母]表示json包数据分类
Json::Value val
val["TYPE"]:(string)login regiser insert search update delete collect
val["SOCKFD"]:(int)-1 fd
val["NAME"] :(string) name;
val["PW"]:(string) pw
val["ID"] = (string)id;
val["SEX"] = (string)man woman;
val["AGE"] =(int) age;
val["RESULT"] :(stirng)"yes" "no" "message" //服务器端返回TYPE类型的结果:成功则yes 失败则no
管理员登录协议rootlist:
val["TYPE"]:login regiser
val["SOCKFD"]:
val["NAME"] = name;
val["PW"] = pw;
val["RESULT"] :"yes" "no" "message"
小区住户信息协议resident:
val["TYPE"]:insert search update delete collect
val["SOCKFD"]:
val["ID"] = id;
val["NAME"] = name;
val["SEX"] = sex;
val["AGE"] = age;
val["RESULT"] :"yes" "no" "message"
//失误:前期没有分析好协议,导致val["SOCKFD"] 这一项多余
二:服务器端(多线程)概要设计:
1.主线程System.h:libevent事件监听: clifd上有请求,将clifd放入共享队列。开启线程池。
ShareQueue.h:为保证线程安全,设计为单例模式,pop时加锁。
2.线程池PthreadPool.h:阻塞在pop队列中(如果queue为空,则阻塞),
sharequeue上有clifd,则进入下一层,MVC 事物处理。
3.Contral.h :MVC‘s C:处理clifd上的事件 :
1).接受客户端发来的数据,json解包
2).根据json["TYPE"],调用View.h中的树立函数:class View 为抽象类,通过继承,得到不同事物对应的class和处理函数
View_login View_registe....等派生类
再把json包中数据,调用class Databaase 中的方法得到json["RESULT"]
创建json包,将结果发回给客户端
3).Database.h 连接数据库,bool返回类型的成员函数:验证login/registe/insert....结果是否正确