当前位置: 首页 > news >正文

项目——基于C/S架构的预约系统平台 (1)

前言:

从正式接触编程到现在 大半年终于开始自己完完整整搞一个项目。

我对这个项目的定义是:它的功能很玩具 但是它的可优化点很高 似乎基于c/s架构的东西优化点就非常多 所以实现它就似乎是在给洋娃娃套上机甲一样 对于目前的我来说是这样的。

对于第一次搞项目的我产生了很多疑问

我很困扰的是,我系统的学完了那些MySQL跟redis之类的东西,但是我似乎那些命令记得一点都不牢 所以我在想我是不是应该在做项目的时候慢慢就水到渠成了?

我问学长们 我说写项目写到什么程度才能把这个项目放到简历上?

他们告诉我标准是能应对面试官的一些问题,比如他会问你在项目中遇到了什么困难。要回答出来 但是, 最好是自己手搓出来,就是完全由自己构思,但是我现在都水平似乎,就你让我拿脑袋空想我要做一个c/s的在线预约系统,我似乎没有办法想出来。我最多只会做出来c/s的最基本的代码。剩下的让我空想根本想不出来怎么继续写下去。 标准的项目答案代码我这里也有的,但是我怕我这样一看就没有自己的思考过程,那这个项目就似乎没什么说法了,而且更何况我是想把这个项目放在简历上,所以我就很困扰。

现在广为流传tinywebserver已经烂大街 什么系统系统已经烂大街 放在简历上一定要放个拿彩的 开源的项目 但对于现在的我来说 如果这类被人说为玩具的项目我还不能够实现 那何谈开源?

所以一切的一切 还是先动手码出来项目的架构再说 只有做出来才有答案

ser.h

 #include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<event.h>
#include<jsoncpp/json/json.h>
using namespace std;
const int listenmax=10;
class socket_listen{
public:socket_listen(){sockfd=-1;m_port=6000;m_ips="127.0.0.1";}socket_listen(string ips,short port):m_ips(ips),m_port(port){sockfd=-1;}bool socket_init();int accept_client();void set_base(struct event_base*base){this->base=base;}int getsockfd()const{return sockfd;}struct event_base* get_base()const{return base;}private:int sockfd;short m_port;string m_ips;struct event_base * base;
};class socket_con{
public:socket_con(int fd):c(fd){c_ev=NULL;}void set_ev(struct event*ev){c_ev=ev;}~socket_con(){event_free(c_ev);close(c);}void recv_data();
private:int c;struct event* c_ev;
};

ser.cpp

 #include"ser.h"
//socket_listen
bool socket_listen::socket_init(){sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd)return false;struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(m_port);saddr.sin_addr.s_addr=inet_addr(m_ips.c_str());int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(-1==res){perror("绑定失败\n");close(sockfd);return false;}res=listen(sockfd,listenmax);if(res==-1)return false;return true;
}
int socket_listen::accept_client(){int c=accept(sockfd,NULL,NULL);return c;
}//socket_con
void socket_con::recv_data(){char buff[256]={0};int n=recv(c,buff,255,0);if(n<=0){cout<<"client close"<<endl;delete this;return;}//测试cout<<"recv:"<<buff<<endl;//解析Json::Value val;val["status"]="OK";send(c,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0);
}//callback
void SOCK_CON_CALLBACK(int fd,short ev,void *arg){socket_con*q=(socket_con*)arg;if(ev&EV_READ){q->recv_data();}}void SOCK_LIS_CALLBACK(int sockfd,short ev,void *arg){socket_listen* p=(socket_listen*)arg;if(p==NULL)return;if(ev&EV_READ){ //处理读事件int c=p->accept_client();if(c==-1)return;cout<<"accept:c="<<c<<endl;socket_con *q=new socket_con(c);struct event*c_ev=event_new(p->get_base(),c,EV_READ|EV_PERSIST,SOCK_CON_CALLBACK,q);if(c_ev==NULL){close(c);delete q;return;}q->set_ev(c_ev);//添加到libeventevent_add(c_ev,NULL);}}int main(){//监听套接字socket_listen socket_ser;if(!socket_ser.socket_init()){cout<<"socket init err!"<<endl;exit(1);}//创建libevent basestruct event_base*base=event_init();if(base==NULL){cout<<"base null"<<endl;exit(1);}//设置socket_listen中的libevent中的basesocket_ser.set_base(base);//添加sockfd到libeventstruct event*sock_ev=event_new(base,socket_ser.getsockfd(),EV_READ|EV_PERSIST,SOCK_LIS_CALLBACK,&socket_ser);event_add(sock_ev,NULL);//启动事件循环event_base_dispatch(base);//select poll epoll//释放资源event_free(sock_ev);event_base_free(base);return 0;
}    

cli.h

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<jsoncpp/json/json.h>using namespace std;
const int offset=2;
enum op_type{DL=1,ZC,CKYY,YD,CKYD,QXYD,TC};
class socket_client{
public:socket_client(){sockfd=-1;ips="127.0.0.1";port=6000;dl_flg=false;user_op=0;runing=true;}socket_client(string ips,short port){sockfd=-1;this->ips=ips;this->port=port;dl_flg=false;user_op=0;runing=true;}void print_info();~socket_client(){close(sockfd);}bool connnect_server();void user_register();void user_login();void run();
private:string ips;short port;int sockfd;bool dl_flg;string username;string usertel;int user_op;bool runing;
};

cli.cpp

  #include"cli.h"
bool socket_client::connnect_server(){sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("create socket err!\n");return false;}struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(port);saddr.sin_addr.s_addr=inet_addr(ips.c_str());int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res==-1){perror("connect ser err!\n");return false;}cout<<"connect to server success"<<endl;return true;
}
void socket_client::print_info(){if(dl_flg){cout<<"--已登陆-------用户名:"<<username<<"-------"<<endl;cout<<"1:查看预约   2:预订  3: 查看我的预约  4:取消预约  5:退出"<<endl;cout<<"-------------------------------------------------"<<endl;cout<<"请输入选项编号:"<<endl;cin>>user_op;user_op+=offset;}else{cout<<"---未登陆-----游客-----"<<endl;cout<<"1:登陆   2:注册  3: 退出 "<<endl;cout<<"-----------------"<<endl;cout<<"请输入选项编号:"<<endl;cin>>user_op;if(user_op==3)user_op=TC;}
}void socket_client::user_register(){cout<<"请输入用户手机号码:"<<endl;cin>>usertel;cout<<"请输入用户名"<<endl;cin>>username;string passwd,tmp;cout<<"请输入密码:"<<endl;cin>>passwd;cout<<"请再次输入密码"<<endl;cin>>tmp;if(usertel.empty()||username.empty()){cout<<"手机或用户名不能为空"<<endl;return;}if(passwd.compare(tmp)!=0){cout<<"密码不一致"<<endl;return;}Json::Value val;val["type"]=ZC;val["user_tel"]=usertel;val["user_name"]=username;val["user_passwd"]=passwd;send(sockfd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0);char buff[256]={0};if(recv(sockfd,buff,255,0)<=0){cout<<"ser close"<<endl;return;}val.clear();Json::Reader Read;if(!Read.parse(buff,val)){cout<<"json 解析失败"<<endl;return;}string s=val["status"].asString();if(s.compare("OK")!=0){cout<<"注册失败"<<endl;return;}cout<<"注册成功"<<endl;return;
}
void socket_client::user_login(){cout<<"登陆"<<endl;
}void socket_client::run(){while(true){print_info();switch(user_op){case DL:user_login();break;case ZC:user_register();break;case CKYY:break;case YD:break;case QXYD:break;case CKYD:break;case TC:runing=false;break;default:cout<<"输入无效"<<endl;break;}}}
int main(){socket_client cli;if(!cli.connnect_server())exit(1);cli.run();exit(0);
} 

目前可优化点:

🔴 高优先级(影响功能正确性)

  1. 数据完整性保障

    • send可能只发送部分数据,需要循环发送确保完整

    • recv可能只接收部分数据,需要循环接收确保完整

    • 考虑定义应用层协议(如:长度+数据)

  2. 资源管理与内存安全

    • socket_con的析构需要验证是否正确释放资源

    • 考虑使用智能指针替代裸指针管理动态对象

🟡 中优先级(影响性能与并发)

  1. Socket非阻塞化

    • 服务端监听socket设为非阻塞

    • 客户端连接socket设为非阻塞

    • 处理EAGAIN/EWOULDBLOCK错误码

  2. Libevent性能优化

    • 从LT模式切换到ET模式

    • 使用Libevent2新API替代老API

    • 配置高性能事件驱动后端

🟢 低优先级(代码质量与扩展性)

  1. 代码结构优化

    • 封装数据发送/接收的通用函数

    • 错误处理统一化

    • 日志系统完善

  2. 功能增强

    • 超时机制与心跳包

    • 连接池管理

    • 数据序列化协议优化

http://www.dtcms.com/a/521467.html

相关文章:

  • 机器学习预测波动率辅助ETF动态止损边界设定
  • 搭建网站一条龙柳江网站开发
  • 网站建设木马科技做美妆网站的关键词
  • 区块链的专业名字从基础到应用​​,从​​技术到生态
  • php个人网站源码带音乐如何去国外网站看内容
  • 关于我们 About Techub News
  • 大腾智能PDM在华为云生态中的应用实践——旭派锂能研发管理数字化转型
  • 椭圆曲线密码学的效率核心:单标量与多标量乘法详解
  • 期货看盘和下单简要说明
  • c2c网站系统芜湖哪家公司做网站不错
  • 网站做cdn怎么弄如何去掉wordpress作者链接
  • 每日开源项目1——HyperLogLog库
  • Dify、FastGPT、BuildingAI 与 RAGFlow 深度体验记录
  • ESP32S3入门之环境搭建
  • 深圳建网站兴田德润很好本地网站更新不了 vps登陆可以
  • 云存储能用来做网站吗网页制作费用大概多少
  • 2017辽宁建设厅查询网站大连网站建设公司排名
  • 性能测试-jmeter16-性能环境搭建、脚本编写、测试数据构造
  • 网站建设分为哪几种类型平台类网站建设价格表
  • kubernets简介和部署
  • YOLO V4 整体架构的由来及用法 详解
  • 青岛网站开发公司wordpress js加载速度慢
  • 上海松一网站建设wordpress产品展示
  • python-xml
  • 番禺网站建设专家wordpress set option
  • 郑州模板网站设计哪家便宜推广策略及推广方式
  • RTMP推拉流平台EasyDSS视频推拉流技术的应用以及视频推流是怎样的流程?
  • JDBC-MySQL数据库连接与使用
  • 江门cms模板建站寮步镇网站建设
  • 网站后台用什么软件做iphone app wordpress